Frage

Hallo, ich verstehe diese einfache SQL -Abfrage nicht mit JOIN. Ich möchte Produkt mit zwei Attributen auswählen. Hier sind Tabellen (Produkt und dann Attribute):

Product table

Attribute table

Und hier geht zwei Fragen

Erste Abfrage machen nur einen mit 4 und operatoren und geben keine Daten zurück (sollte es aber sollte).

Zweite Abfrage beitreten zwei mit dem Tabellenprodukt <--> attrv_1 und product <--> attrv_2 und funktioniert sehr gut. :

Hier ist die erste Frage

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%' 

und zweite Abfrage, die die richtigen Daten zurückgeben:

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%'   

In der zweiten SQL -Abfrage habe ich zweimal beigetreten, um Produkte mit zwei Attributen zu finden.

Warum gilt die erste Abfrage nicht mit einem Join?

Hier ist Ausgabe:

Second query output

War es hilfreich?

Lösung

"Warum gilt die erste Abfrage nicht und Betreiber mit einem Join?"

Weil es in Attributen -Tabellen, die Atrid = 1 und Atrid = 2 gleichzeitig haben könnten, keine Zeilen haben.

Ich könnte an eine Lösung denken, die Gruppen durch die Erzielung von Klauseln für die gewünschten Ergebnisse verwenden könnte, aber Ihre zweite Abfrage wäre höchstwahrscheinlich schneller und einfacher zu verstehen.

Andere Tipps

Ihre erste Abfrage kann niemals Ergebnisse zurückgeben. Was Sie darum bitten, jedes Produkt zu erhalten, für das die Attributentabelle einen Eintrag hat, in dem das Feld AtrValue gleich 1 ist und das Feld AtrValue ebenfalls gleich 2 ist. Da es eines der anderen sein muss, bedeutet dies die Die rechte Seite Ihres Join wird niemals Einträge haben, und da dies eine innere Verbindung ist, wird die linke Seite niemals übereinstimmen, daher keine Zeilen. Was Sie tatsächlich wollen, ist oder zwischen Ihren beiden Bedingungensätzen:

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%')

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top