MySQL multiple WHERE AND / OR condition logic

Aug 26 2020

Saya ingin memiliki pernyataan SQL WHERE yaitu (ini atau ini atau ini) DAN (ini atau ini atau ini)

Jadi salah satu dari tanda kurung pertama DAN salah satu dari tanda kurung kedua.

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

Mengapa ini tidak memberikan hasil apa pun?

Melakukan hanya bagian pertama, berfungsi dengan baik:

AND ((li.MSAttributeID = 82 AND li.MSAttributeValID = 5) OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6))

dan begitu juga jika saya hanya melakukan bagian kedua:

 AND ((li.MSAttributeID = 85 AND li.MSAttributeValID = 223) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 229) OR (li.MSAttributeID = 85 AND li.MSAttributeValID = 247))

Tapi tidak keduanya digabungkan. Yang seharusnya memberikan hasil jika cara saya berpikir benar!

Jawaban

1 JimMacaulay Aug 26 2020 at 15:13

Anda harus menggunakan ORbukan ANDdalam kondisi kedua

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 membuat kedua kondisi tersebut valid dan tidak mengembalikan hasil

Di bawah ini adalah cara yang tepat untuk memberikan kondisi tersebut,

 AND ((li.MSAttributeID in (82, 85) AND li.MSAttributeValID in (5, 6, 223, 229, 247 )) OR (li.MSAttributeID = 82 AND li.MSAttributeValID = 6))
1 forpas Aug 26 2020 at 15:40

Kondisi Anda yang disederhanakan agar mudah dibaca dapat ditulis seperti ini:

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

atau bahkan lebih sederhana:

AND (x = 82 AND y IN (5, 6))
AND (x = 85 AND y IN (223, 229, 247))

Sekarang karena hanya ada ANDs maka tanda kurung dapat dihilangkan dan kondisinya adalah:

AND x = 82 AND y IN (5, 6) AND x = 85 AND y IN (223, 229, 247)

Seperti yang Anda lihat, Anda memiliki:

x = 82 AND x = 85

yang selalu falsedan juga:

y IN (5, 6) AND y IN (223, 229, 247)

yang selalu false.

Jadi hasil dari ekspresi Boolean adalah falsedan Anda tidak mendapatkan hasil.

Mungkin Anda menginginkan yang seperti ini:

AND (
  (li.MSAttributeID = 82 AND li.MSAttributeValID IN (5, 6))
  OR 
  (li.MSAttributeID = 85 AND li.MSAttributeValID IN (223, 229, 247))
)
J.Schmale Aug 26 2020 at 15:29

Di baris pertama, Anda memiliki 2 kombinasi MSAttributeId dan MSAttributeValID. Kemudian di baris kedua, Anda memiliki 3 kombinasi lainnya. Saya pikir apa yang Anda inginkan adalah mengembalikan hasil yang cocok dengan salah satu dari 5 kombinasi tersebut. Jadi yang Anda inginkan adalah:

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

Saya akan menambahkan bahwa alasan dua baris Anda bergabung dengan DAN tidak mengembalikan hasil adalah karena dengan melakukan itu Anda mengatakan bahwa MSAttribteID harus sama dengan 82 dan 85 pada saat yang sama - yang tidak mungkin.