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 :

sélection pour deux valeurs fixes d'un champ


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 19
    Points
    19
    Par défaut sélection pour deux valeurs fixes d'un champ
    Bonjour à tous,

    Je m'arrache les cheveux sur cette question : comment faire pour sélectionner les enregistrements qui répondent à 2 valeurs exactes d'une même colonne ?

    TABLE criteres
    id, INT
    id_critere, INT
    PRIMARY KEY (id,id_critere)
    Je voudrais faire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id
    FROM `criteres` WHERE`id_critere` = 108
    AND `id_critere` = 6
    Mais je voudrais avoir les lignes qui ont à la fois "6" et "108" comme valeur pour le champ id_critere`, or, bien que ma table contiennent les deux lignes suivantes :
    id = 18144, id_critere = 6
    id = 18144, id_critere = 108
    MySQL ne me retourne pas de résultat, ce qui me semble normal, mais du coup, comment faire celà, sachant que mon exemple se base sur 2 valeurs de 'id_critere', mais que l'algo pourrait bien me demander 3, 4 ou 10 valeurs et donc que je doive trouver tous les id !

    Merci pour vos suggestions !

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Bonjour,

    Avec 2 valeurs, il suffit d'une auto-jointure sur la table criteres.*
    Là où ça se complique, c'est pour le faire avec 3, ... 10 valeurs.
    Je te propose la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.id
    FROM criteres c
    INNER JOIN criteres c2 ON c.id = c2.id AND c.id_critere = c2.id_critere AND c2.id_critere IN (6, 108, 207, ...) #liste des id_criteres
    GROUP BY c.id
    HAVING COUNT(*) = 3 #nombre d'id_criteres
    J'ai mis en commentaire ce que l'algorithme doit compléter/modifier.
    En gros, dans la condition de jointure, tu mets la liste des id_criteres à tester, et dans le HAVING, tu mets le nombre d'id_criteres différents.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Salut,

    Tu peux passer par une jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT c1.id FROM criteres c1
       INNER JOIN criteres c2 ON c1.id = c2.id
    WHERE c1.id_critere = 6
       AND c2.id_critere = 108
    Edit : grilled (en mieux en plus )
    Pensez au bouton

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 19
    Points
    19
    Par défaut
    Merci Maximilian,

    Mais la jointure ne me convient pas, car elle suppose que l'on connaisse le nombre de critères à l'avance. Or, mon algo me dit juste que je vais devoir chercher les id pour un ensemble fini d'id_critere, mais sans connaître le nombre d'éléments dans cet ensemble...

    Merci Ced, cela ressemble plus à ce que je souhaite, mais un doute m'envahit : avec la clause IN (6,108,207...), je vais aussi retourner des lignes qui ont seulement l'une de ces valeurs comme id_critere, non ? Or moi je veux les lignes qui ont tous les id_critere...

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Citation Envoyé par avairet Voir le message
    avec la clause IN (6,108,207...), je vais aussi retourner des lignes qui ont seulement l'une de ces valeurs comme id_critere, non ? Or moi je veux les lignes qui ont tous les id_critere...
    D'où le COUNT à la fin de la requête, dans la clause HAVING... Pour ne garder que ces lignes-là .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Points : 19
    Points
    19
    Par défaut
    Merci Ced, cela fonctionne bien ! Je ne connais pas assez l'utilisation de Having... je vais creuser le manuel MySQL !

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Regarde plutôt les tutoriels sur le SQL...
    Notamment ici.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonjour à tous,

    Merci Ced pour la solution que tu proposes, c'est ce que je recherchais aussi.
    Mais j'ai besoin d'un complément :
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND c2.id_critere IN (6, 108, 207, ...) #liste des id_criteres
    on sous-entend que l'on recherche : 6 ET 108 ET 207 ET ...

    Maintenant, que faut-il faire pour rechercher par exemple : ( 6 OU 108) ET 207 ET 354

    J'ai pensé à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT a.id
    FROM critere a
    INNER JOIN critere b ON a.id = b.id AND a.id_critere = b.id_critere
    AND (
           b.id_critere IN (6, 207, 354)
           OR b.id_critere IN (108, 207, 354)
    )
    GROUP BY b.id
    HAVING COUNT(*) = 4
    qui a l'air de donner un bon résultat, mais j'ai besoin de vos avis pour valider ma proposition.

    Merci pour votre confirmation ou correction

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Ah ben non, là ça ne marche plus...
    Exemple :
    id=18146, id_critere=108
    id=18146, id_critere=207
    id=18146, id_critere=354
    Cet id n'a que 3 critères correspondant, qui sont tous bon d'après le filtre appliqué dans la jointure, mais le count ne donne que 3 et pas 4, donc il n'est pas sélectionné.

    Je n'ai rien trouvé de mieux qu'une union entre les deux conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT a.id
    FROM criteres a
    INNER JOIN criteres b ON a.id = b.id and a.id_critere = b.id_critere
    AND b.id_critere in (6, 207, 354)
    group by a.id
    having count(*) = 3
    union
    SELECT a.id
    FROM criteres a
    INNER JOIN criteres b ON a.id = b.id and a.id_critere = b.id_critere
    AND b.id_critere in (108, 207, 354)
    group by a.id
    having count(*) = 3
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Ah oui !
    Je n'avais pas pensé au cas le plus simple.

    L'union des requêtes que tu proposes est bon, mais je me dis que ça va être lourd si je dois faire la recherche : 6 OU 108 OU 207 OU 354 ...

    Sinon, je sais qu'il y a la possibilité de construire une table temporaire résultant des OU entre id_critere, sur laquelle on applique la requete id_critere IN (..., ..., ... )
    Je n'ai jamais fait ça, mais je vais essayer. Qu'en penses-tu ?

  11. #11
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 031
    Points : 23 763
    Points
    23 763
    Par défaut
    Effectivement, plus il y a de OU et pire ça va être.
    Le passage par une table temporaire devrait être plus efficace.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/11/2014, 17h46
  2. Réponses: 3
    Dernier message: 29/04/2010, 13h54
  3. [Toutes versions] Requête - calcul de délai entre deux valeurs d'un même champ
    Par remi59 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 05/02/2010, 11h53
  4. boucle pour la valeur min d'un champ
    Par averooès dans le forum VBA Access
    Réponses: 6
    Dernier message: 23/01/2009, 14h41
  5. sélection multiple de valeurs dans un seul champ
    Par antoine0207 dans le forum Access
    Réponses: 4
    Dernier message: 04/07/2006, 17h01

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