|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 10 ![]() |
Bonjour,
Je n'arrive pas à faire une recherche sur une table dont voici la structure et 3 lignes : ![]() Je voudrais que la requête suivante me retourne la valeur produit = 2 : Code :
SELECT produit FROM `catalogue_produit_specificite` WHERE (specificite=1 AND valeur=2) AND (specificite=2 AND valeur=3) Or... aucun résultat. Je crois comprendre pourquoi, mais je ne vois pas comment résoudre mon problème. Quelqu'un saurait m'aider ? Merci d'avance |
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Saluton,
Il te faut mettre la table en jointure avec elle-même, faire un regroupement par produit, compter les lignes qui participent de la jointure et ne retenir que les regroupements dont l'effectif est égal à 2 Code sql :
Si ce n'était pas le cas il faudrait remplacer Code :
INNER JOIN `catalogue_produit_specificite` AS c2 Code :
INNER JOIN (SELECT DISTINCT produit, specificite, valeur FROM`catalogue_produit_specificite`) AS c2
__________________
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) |
||
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : août 2002 Messages : 1 036 ![]() |
Bonjour,
J'ai essayé ta requête avec tes données. Celle-ci me retourne bien le produit 2. J'ai ajouté une ligne : 3,1,2. Cette même requête retourne les produits 2 et 3. Donc, à moins que je n'ai pas compris le problème, je ne vois pas où il y en a un. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Vu que la jointure se fait, principalement, sur l'identifiant produit, je ne vois pas comment le count(*) pourrait retourner autre chose que 1 alors qu'il n'y a qu'une ligne dans la table avec l'identifiant produit = 3.
Soit c'est la requête qui a été modifiée, soit il y a autre chose dans la table. Par contre je me rends compte que si les lignes 2,1,2 et 2,2,3 étaient 2,2,2 et 2,1,3 la requête retournerait bien 2. Ce n'est peut-être pas grave, mais il vaut mieux le préciser.
__________________
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) |
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : août 2002 Messages : 1 036 ![]() |
Maljuna Kris => Désolé, j'ai été un peu vite : je n'ai pas vu la barre de scroll sous la requête, et la deuxième condition est masquée.
Et comme ça : Code :
|
||
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Tu dois gagner sur le GROUP BY et le COUNT, par contre il faut ajouter DISTINCT dans le SELECT sinon, évidemment, tu auras des doublons.
Et ma mise ne garde afférente à l'unicité du trio {produit, specificite, valeur} reste valable.
__________________
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) |
|
00
|
|
|
#7 | |||||
|
Membre Expert
![]() Inscription : août 2002 Messages : 1 036 ![]() |
Citation:
Citation:
Citation:
Citation:
Citation:
|
|||||
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Voui, au temps pour moi, j'avais gardé la logique du IN.
__________________
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) |
|
00
|
|
|
#9 | ||||||
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 10 ![]() |
Tout d'abord merci à vous pour vos réponses.
Citation:
Par contre, je vois l'idée avec la jointure, que reprend d'ailleurs jeca : Citation:
Cependant, j'ai plusieurs fois dans ma table plus de deux lignes pour un même produit (jusqu'à une trentaine). Ça m'embête un peu d'utiliser PHP pour générer une requête avec un nombre de jointures aléatoires (30 jointures de la même table, c'est étrange, non ?). N'y-a-t-il pas un moyen plus simple et plus "propre" ? Au fait, pour l'unicité des valeurs, j'ai une clé unique qui m'empêche d'ajouter deux spécificités identiques pour un même produit : 2 1 2 2 1 3 --> impossible Par contre, pas de problème pour : 2 1 2 2 2 2 2 3 2 Encore merci d'avance ;-) |
||||||
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
En reprenant l'idée du HAVING mais sans jointure, je pense que ça correspond à ce que tu recherches :
Code :
Pour ne conserver que ceux qui les possèdent tous tu utilises HAVING count(*) = le_nombre_de_couples_placés_dans_le_IN. |
||
|
|
00
|
|
|
#11 | |||
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 10 ![]() |
Citation:
EDIT : Si ça peut aider quelqu'un, j'ai du ajouter DISTINCT pour HAVING COUNT(DISTINCT colonne) = nombre_de_couples |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com