Есть таблица, например 'params' c структурой:
id, product_id, param_id
1 1 1
2 1 2
3 2 2 и т.д.
Как мне получить все product_id, для которых param_id = 1 и param_id = 2 одновременно?
SELECT DISTICT product_id FROM t AS t1
LEFT JOIN t AS t2 ON t1.product_id = t2.product_id
WHERE t1.param_id = 1 AND t2.param_id = 2 OR t1.param_id = 2 AND t2.param_id = 1
maximw: а если значений param_id будет 3 или 4, то часть в WHERE будет сложной, да? Может быть разделить на несколько запросов. Например, первым получаем все product_id WHERE param_id = 1. Вторым запросом WHERE param_id = 2 AND product_id in (результаты из первого запроса) и т.д. Или лучше одним запросом?
Если значений param_id будет 3 или 4, то не только WHERE будет сложный, но и JOIN надо будет делать столько же раз.
Да, можно сделать декомпозицию на несколько запросов через WHERE IN. Но там могут быть просадки по производительности.
SELECT product_id FROM t AS t1
WHERE t1.param_id = 1 AND t1.product_id IN (SELECT product_id FROM t AS t2 WHERE t2.param_id = 2 AND t1.product_id IN (....) )
Получаются вложенные подзапросы. Но их можно развернуть в скрипте в цикл. например так:
SELECT product_id FROM t AS t1
WHERE t1.param_id = 1 AND t1.product_id IN (1, 3, 4, 7 )
А список 1, 3, 4, 7 формируется из результатов предыдущего запроса.