Question

Salut, je ne comprends pas cette simple requête SQL avec JOIN. Je veux choisir le produit avec deux attributs. Voici les tableaux (produits et attributs):

table de produit

Table d'attributs

Et va ici deux requêtes

Première requête ne se joindre à une seule 4 et les opérateurs et renvoyaient aucune donnée (mais il se doit).

Deuxième requête Deux hommes se joindre aux tables produit <-> attrv_1 et produit <-> attrv_2 et fonctionne très bien. :

Voici la première requête

SELECT * 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv ON p.productid = attrv.productid
                    AND attrv.atrid = 1
                    AND attrv.atrvalue like '%JANICKA IWONA%' 
                    AND attrv.atrid = 2
                    AND attrv.atrvalue like '%N.ERA%' 

et seconde requête qui renvoie les données correctes:

SELECT p.* 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv_1 ON p.productid = attrv_1.productid
                    AND attrv_1.atrid = 1
                    AND attrv_1.atrvalue LIKE '%JANICKA IWONA%'
INNER JOIN tblAttributesValues attrv_2 ON p.ProductID = attrv_2.ProductId
                    AND attrv_2.atrid = 2
                    AND attrv_2.atrvalue LIKE '%N.ERA%'   

Dans la deuxième requête SQL je ne rejoins deux fois pour trouver le produit avec deux attributs.

Pourquoi la première requête ne concerne pas l'opérateur AND avec une jointure?

Voici la sortie:

Sortie de la deuxième requête

Était-ce utile?

La solution

« Pourquoi la première requête ne concerne pas l'opérateur AND avec une jointure? »

Parce qu'il n'y a pas de lignes dans la table des attributs qui pourrait avoir Atrid = 1 et Atrid = 2 en même temps.

Je pourrais pensé à une solution qui pourrait utiliser par groupe, ayant et compte des clauses pour obtenir les résultats souhaités, mais votre deuxième requête serait probablement plus rapide et plus simple à comprendre.

Autres conseils

Votre première requête ne peut jamais retourner aucun résultat. Ce que vous demandez à faire est d'obtenir tous les produits pour lesquels la table d'attribut a une entrée où le champ atrvalue est égal à 1 et le champ atrvalue est aussi égal à 2. Comme il doit être l'un de l'autre, cela signifie que le côté droit de votre joindre aura jamais d'entrées, et puisque c'est une jointure interne du côté gauche ne sera jamais égalé, par conséquent aucune ligne. Qu'est-ce que vous voulez réellement est un OU entre vos deux ensembles de conditions:

SELECT * from tblProducts p join tblAttributesValues attrv ON p.productid = attrv.productid AND (attrv.atrid = 1 AND attrv.atrvalue like '%JANICKA IWONA%') OR (attrv.atrid = 2 AND attrv.atrvalue like '%N.ERA%')

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top