IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Sous requête


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 15
    Points
    15
    Par défaut Sous requête
    Bonjour,

    j'ai 3 tables, user(id ...), question(id...) , q_fait(id_user,id_question,fait).

    Ma requête : afficher une question aléatoirement parmi toute les questions qui n'ont pas étaient faite par l'utilisateur en cours.
    J'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT question
    FROM questions
    WHERE id !=(
    		SELECT id_question
    		FROM q_fait
    		WHERE id_user = '".$id_user."'
    		AND fait = 'oui'
    		)
    ORDER BY rand()
    LIMIT 1;
    Ca marche sauf si la sous-requete ne renvoie rien.

    Auriez vous une solution ?

    Merci d'avance,

  2. #2
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Points : 2 015
    Points
    2 015
    Par défaut
    Pour apposer une ou plusieurs (voire 0) propositions, tu mets un IN. Cela devrait suffire.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT question
    FROM questions
    WHERE id IN (
    		SELECT id_question
    		FROM q_fait
    		WHERE id_user = '".$id_user."'
    		AND fait = 'oui'
    		)
    ORDER BY rand()
    LIMIT 1;
    A la volée, je te conseillerai de mettre la limite et le tri dans la sous-requête. Cela évitera des recherches dans la table questions qui ne serviront à rien à part mobiliser inutilement ton serveur :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT question
    FROM questions
    WHERE id IN (
    		SELECT id_question
    		FROM q_fait
    		WHERE id_user = '".$id_user."'
    		AND fait = 'oui'
    		ORDER BY rand()
    		LIMIT 1
    		);
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup.

    Au final mon code sera tel quel car si je met le limit dans la sous requete il me dit que ma version de mysql ne peut pas le prendre en compte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT question
    FROM questions
    WHERE id NOT IN (
    		SELECT id_question
    		FROM q_fait
    		WHERE id_user = '".$id_user."'
    		AND fait = 'oui'
    		)
    ORDER BY rand()
    LIMIT 1;

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Pour éviter la sous-requête on peut essayer cela
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT q.question
    FROM questions AS q
    LEFT JOIN q_fait AS qf 
    ON q.id = qf.id_question
       AND qf.id_user = '".$id_user."'
       AND qf.fait = 'oui'
    WHERE qf.id_question IS NULL
    ORDER BY RAND()
    LIMIT 1;
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Points : 2 015
    Points
    2 015
    Par défaut
    Effectivement, j'avais pas cherché à la virer, mais c'est une optimisation des plus intéressantes.
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC] [API mySQL] Sous requêtes
    Par Guybrush113 dans le forum MFC
    Réponses: 5
    Dernier message: 29/04/2004, 16h14
  2. Problème DBExpress et sous requêtes ???
    Par Trulane dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/03/2004, 14h40
  3. Requêtes et sous requêtes
    Par lau2nyce dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2004, 15h14
  4. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo