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 :

Select en fonction de 2 critères dans la même colonne


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Select en fonction de 2 critères dans la même colonne
    Bonsoir à tous,

    Une nouvelle fois, je viens faire appel à votre aide. C’est un truc qui me fait tourner la tête. J’ai regardé sur google et à croire que je suis le seul à être confronté à ça. J’ai essayé de m’inspirer de là : http://www.ii.metu.edu.tr/~ion503/de.../chapter53.htm mais dans cet exemple, il y a 3 tables alors que je n’en ai que deux.

    J’ai la base de donnée suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Grange	             Animal
    1	             brebis
    1	             vache
    1	             canard
    2	             brebis
    2	             chêvre
    3	             vache
    3	             brebis
    3	             cheval
    4	             âne
    4	             brebis
    Attention, les données Grange et Animal n’appartiennent pas à la même table. Pour faire simple, la 1ère table s’appelle Table1 et l’autre Table2. Elles sont reliées par leur clé Id. Ce que je souhaite faire, c’est récupérer les granges qui ont le couple d’animaux suivant: vache;brebis, soit les granges 1 et 3. J’ai donc exécuté le code suivant sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select grange
    From Table1 a,Table2 b
    Where a.IdTable1=b.IdTable2
    And animal=’brebis’ and animal=’vache’
    Je crois comprendre, en fait, qu’avec cette requête, je demande les granges où l’animal est à la fois une brebis et une vache d’où évidemment problème.Si je veux les granges avec une vache ou une brebis, je n'ai aucun souci.

    Edit:IdTable1=IdTable2 bien sûr

    Merci d'avance

  2. #2
    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,
    Est-ce que les granges ne doivent avoir que le couple brebis-vache ou peuvent-elles avoir aussi d'autres animaux ?


    OOoops ! la réponse était dans l'exemple.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Est-ce que les granges ne doivent avoir que le couple brebis-vache ou peuvent-elles avoir aussi d'autres animaux ?
    Bonsoir,

    Merci de t'intéresser à ce topic.Il s'agit d'un exemple:dans l'idéal, je veux pouvoir choisir le couple (il est donc quelconque),ça peut être un trio,etc....(le nombre d'animaux est indéfini) mais en tout cas je ne veux qu'un couple ou un trio ou..à la fois.Je ne veux donc pas en même temps par exemple la liste des granges avec le couple brebis-vache ou avec un autre couple.Si j'ai besoin d'un autre couple, je refais la requête.Merci encore et en espérant avoir été assez clair.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT grange, GROUP_CONCAT(animal) AS bestiaire
    FROM Table1 a
    INNER JOIN Table2 b on a.IdTable1=b.IdTable2
    GROUP BY grange
    HAVING INSTR(bestiaire,'brebis') >0 AND INSTR(bestiaire,'vache') >0

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT grange, GROUP_CONCAT(animal ORDER BY animal) AS bestiaire
    FROM Table1 a
    INNER JOIN Table2 b on a.IdTable1=b.IdTable2
    GROUP BY grange
    HAVING INSTR(bestiaire,'brebis') >0 AND INSTR(bestiaire,'vache') >0
    On s'est croisé.Je regarderai ça lundi.Merci beaucoup et bonne soirée.

  6. #6
    Membre actif
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Points : 217
    Points
    217
    Par défaut
    Bonsoir,
    1ere idée (peut etre pas la + rapide)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select grange from table1
    where idtable1 in(select idtable2 from table2 where animal='brebis')
    and idtable1 in (select idtable2 from table2 where animal='vache');

  7. #7
    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
    Citation Envoyé par ElbeDD Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT grange FROM table1
    WHERE idtable1 IN(SELECT idtable2 FROM table2 WHERE animal='brebis')
    AND idtable1 IN(SELECT idtable2 FROM table2 WHERE animal='vache');
    Conceptuellement, c'est ce qui colle au plus près de la demande, mais les sous-requêtes sont très gourmandes en ressources.
    D'autant que pour chaque animal (ici 2 mais ça pourrait être plus) il faut une sous-requête.
    C''est pourquoi j'ai proposé une non-équijointure et cette "grosse" astuce avec GROUP_CONCAT, en cas de changement, il n'y a qu'à modifier la clause HAVING.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci.Je suis en train de tester tout ça mais reste bloqué.Je vous tiens au courant.

  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 039
    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 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Ou encore, pour ne faire ça qu'avec des jointures internes, sans sous-requêtes et donc en évitant les dégradations de performances, tu peux utiliser la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a.grange
    FROM Table1 a
    INNER JOIN Table2 b ON a.IdTable1 = b.IdTable2
    INNER JOIN Table1 c ON a.IdTable1 = c.IdTable1
    INNER JOIN Table2 d ON c.IdTable1 = d.IdTable2
    WHERE b.animal='brebis' AND d.animal='vache'
    ced

  10. #10
    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
    Cette dernière requête, très clean et très portable du point de vue de SQL, présente un inconvénient par rapport à ma pirouette avec GROUP_CONCAT et HAVING, en cas de recherche sur 3 critères (voire davantage) il faudra ajouter des paires de jointures et modifier la clause WHERE alors que dans ma proposition il suffit de modifier la clause HAVING.
    Mais c'est plus MySQL que SQL (à moins que MySQL supporte la syntaxe || pour la concaténation, ce dont je doute).
    Portabilité versus évolutivité.....

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    (à moins que MySQL supporte la syntaxe || pour la concaténation, ce dont je doute).
    Il le fait... si tu lui passes un sql_mode lui demandant de le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET SQL_MODE = CONCAT_WS(',', @@sql_mode, 'PIPES_AS_CONCAT') ;
    Sinon le || est un synonyme de OR.

  12. #12
    Membre actif
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Points : 217
    Points
    217
    Par défaut
    Bonsoir,
    Le problème pour "HAVING INSTR(bestiaire,'brebis') >0 AND INSTR(bestiaire,'vache') >0", c'est que si on gere des anes et des canes, et que l'on recherche les anes, y'a un problème (ou distinction poule et poulet pour like de droite)

  13. #13
    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
    Citation Envoyé par ElbeDD Voir le message
    Bonsoir,
    Le problème pour "HAVING INSTR(bestiaire,'brebis') >0 AND INSTR(bestiaire,'vache') >0", c'est que si on gere des anes et des canes, et que l'on recherche les anes, y'a un problème (ou distinction poule et poulet pour like de droite)
    Effectivement, il faut donc plutôt utiliser FIND_IN_SET('anes',bestiaire).

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour

    Merci encore une fois à tous.J'ai pu m'en sortir.

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    tu nous donnerais ta solution ?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Bien sûr.En fait, le seul problème, c’est que s’il faut trouver plusieurs animaux,le code est long et parfois ça met du temps.En tout cas, c'est plus simple que ce que j'imaginais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    select distinct grange
    from Table1 
    where grange in (
        select distinct grange 
        from Table1 a,Table2 b 
        where a.idTable1=idTable2  
        and cat_libelle='vache'
    )
    and grange  in (
        select distinct grange 
        from Table1 a,Table2 b 
        where a.idTable1=idTable2  
        and cat_libelle='brebis'
    )
    order by grange

  17. #17
    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 039
    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 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Bonjour,

    En quoi les différentes requêtes qui t'ont été proposées ne convenaient pas ?
    Parce que là, pas étonnant que ça soit parfois un peu long avec 2 sous-requêtes (que MySQL apprécie fort peu niveau performances) qui sont parfaitement remplaçable par de simples jointures (cf la requête que je t'avais proposée, ou celle de Maljuna Kris).

    ced

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

Discussions similaires

  1. SELECT, JOIN et sous-requêtes dans une même colonne
    Par Alcorak dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/06/2011, 09h04
  2. [Toutes versions] Eclater une table en plusieurs en fonction d'un critère dans un champ
    Par Invité dans le forum Contribuez
    Réponses: 2
    Dernier message: 09/05/2011, 18h46
  3. [XL-2003] BDMOYENNE avec plusieurs critères dans la même colonne
    Par meliria dans le forum Excel
    Réponses: 6
    Dernier message: 19/05/2010, 22h18
  4. [AC-2003] Recherche multi-critère dans une même table
    Par Tadao dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2010, 19h01
  5. Fonction SI OU ET dans la même formule
    Par polynesian turtle dans le forum Excel
    Réponses: 1
    Dernier message: 20/05/2009, 21h09

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