MySQL multiple WHERE UND / ODER Bedingungslogik
Ich möchte eine SQL WHERE-Anweisung haben, die (dies oder das oder das) UND (das oder das oder das) ist.
Also eine der ersten Klammern UND eine der zweiten Klammern.
AND ((li.MSAttributeID = 82 AND li.MSAttributeValID = 5) OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6))
AND ((li.MSAttributeID = 85 AND li.MSAttributeValID = 223) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 229) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 247))
Warum liefert dies keine Ergebnisse?
Nur den ersten Teil zu machen, funktioniert gut:
AND ((li.MSAttributeID = 82 AND li.MSAttributeValID = 5) OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6))
und wenn ich nur den zweiten Teil mache:
AND ((li.MSAttributeID = 85 AND li.MSAttributeValID = 223) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 229) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 247))
Aber nicht beide zusammen. Was Ergebnisse liefern sollte, wenn die Art und Weise, wie ich denke, richtig ist!
Antworten
Sie müssen ORanstelle ANDder zweiten Bedingung verwenden
AND ((li.MSAttributeID = 82 AND li.MSAttributeValID = 5) OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6))
OR ((li.MSAttributeID = 85 AND li.MSAttributeValID = 223) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 229) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 247))
AND macht beide Bedingungen gültig und gibt keine Ergebnisse zurück
Nachfolgend finden Sie die richtige Methode zur Bereitstellung der Bedingung:
AND ((li.MSAttributeID in (82, 85) AND li.MSAttributeValID in (5, 6, 223, 229, 247 )) OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6))
Ihre für die Lesbarkeit vereinfachten Bedingungen können folgendermaßen geschrieben werden:
AND ((x = 82 AND y = 5) OR (x = 82 AND y = 6))
AND ((x = 85 AND y = 223) OR (x = 85 AND y = 229) OR (x = 85 AND y = 247))
oder noch einfacher:
AND (x = 82 AND y IN (5, 6))
AND (x = 85 AND y IN (223, 229, 247))
Da es nur ANDs gibt, können die Klammern entfernt werden und die Bedingung ist:
AND x = 82 AND y IN (5, 6) AND x = 85 AND y IN (223, 229, 247)
Wie Sie sehen können, haben Sie:
x = 82 AND x = 85
das ist immer falseund auch:
y IN (5, 6) AND y IN (223, 229, 247)
das ist immer false.
Das Ergebnis des Booleschen Ausdrucks ist also, falseund Sie erhalten keine Ergebnisse.
Vielleicht möchten Sie so etwas:
AND (
(li.MSAttributeID = 82 AND li.MSAttributeValID IN (5, 6))
OR
(li.MSAttributeID = 85 AND li.MSAttributeValID IN (223, 229, 247))
)
In Ihrer ersten Zeile haben Sie 2 Kombinationen von MSAttributeId und MSAttributeValID. Dann haben Sie in Ihrer zweiten Zeile weitere 3 Kombinationen. Ich denke, Sie möchten Ergebnisse zurückgeben, die mit einer dieser 5 Kombinationen übereinstimmen. Was Sie also wirklich wollen, ist:
AND
(
(li.MSAttributeID = 82 AND li.MSAttributeValID = 5)
OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6)
OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 223)
OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 229)
OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 247)
)
Ich werde hinzufügen, dass der Grund, warum Ihre beiden Zeilen mit dem UND verbunden wurden, keine Ergebnisse ergab, darin besteht, dass Sie damit sagten, dass MSAttribteID gleichzeitig 82 und 85 entsprechen musste - was nicht möglich ist.