Saya akan menulis pengecualian bergabung tanpa subkueri:
SELECT p.productid
FROM products p
INNER JOIN producttags AS t ON p.productid = t.productid
LEFT OUTER JOIN producttags AS x ON p.productid = x.productid
AND x.tag IN ('Motorcycle', 'Green')
WHERE p.active = 1
AND t.tag IN ( 'Ford', 'Black', 'Skateboard' )
AND x.productid IS NULL;
Pastikan Anda memiliki indeks pada produk di dua kolom (aktif, productid) dalam urutan itu.
Anda juga harus memiliki indeks pada producttag di atas dua kolom (productid, tag) dalam urutan itu.
Permintaan lain yang perlu saya lakukan adalah sesuatu seperti semua (Mobil) atau (Skateboard) atau (Hijau DAN Sepeda Motor) atau (Merah DAN Sepeda Motor).
Terkadang kondisi kompleks ini sulit bagi pengoptimal MySQL. Salah satu solusi umum adalah menggunakan UNION untuk menggabungkan kueri yang lebih sederhana:
SELECT p.productid
FROM products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
WHERE p.active = 1
AND t1.tag IN ('Car', 'Skateboard')
UNION ALL
SELECT p.productid
FROM products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
INNER JOIN producttags AS t2 ON p.productid = t2.productid
WHERE p.active = 1
AND t1.tag IN ('Motorcycle')
AND t2.tag IN ('Green', 'Red');
PS:Tabel pemberian tag Anda bukan tabel Entity-Attribute-Value.