サブクエリなしで除外結合を記述します:
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;
2つの列(アクティブ、productid)の順に製品のインデックスがあることを確認してください。
また、2つの列(productid、tag)の製品タグにこの順序でインデックスを付ける必要があります。
もう1つのクエリは、すべて(車)、(スケートボード)、(緑とオートバイ)、(赤とオートバイ)のようなものです。
これらの複雑な条件は、MySQLオプティマイザにとって難しい場合があります。一般的な回避策の1つは、UNIONを使用してより単純なクエリを組み合わせることです。
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:タグ付けテーブルはEntity-Attribute-Valueテーブルではありません。