Ще напиша присъединяването за изключване без подзаявки:
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;
Уверете се, че имате индекс за продуктите в двете колони (активен, productid) в този ред.
Трябва също да имате индекс на продуктовите тагове върху двете колони (productid, tag) в този ред.
Друга заявка, която ще трябва да направя, е нещо като всички (Кола) или (Скейтборд) или (Зелен И Мотоциклет) или (Червен И Мотоциклет).
Понякога тези сложни условия са трудни за MySQL оптимизатора. Едно често срещано решение е да използвате 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:Вашата таблица за маркиране не е таблица за стойност на обект-атрибут.