Как то вы заморочились ... SELECT DISTINCT *FROM table t1LEFT JOIN table t2 ON (t2.product_id = t1.product_id)LEFT JOIN table t3 ON (t3.product_id = t1.product_id)WHERE t1.id_propertie = 100 AND t1.select_value = 2 AND t2.id_propertie = 200 AND t2.select_value = 1 AND t3.id_propertie = 300 AND t3.select_value = 8 Если таблица товаров большая, то по идее может быть имеет смысл использовать EXISTS, например SELECT * FROM table t WHERE EXISTS (SELECT 1 FROM table t1 WHERE t.product_id = t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 2) AND EXISTS (SELECT 1 FROM table t2 WHERE t.product_id = t2.product_id AND t2.id_propertie = 100 AND t2.select_value = 2) AND EXISTS (SELECT 1 FROM table t3 WHERE t.product_id = t3.product_id AND t3.id_propertie = 100 AND t3.select_value = 8) заодно уберем DISTINCT. Если пары id_propertie и select_value встречаются только по одному разу, можно сделать через подзапрос SELECT product_id FROM table t WHERE ( SELECT product_id FROM table t1 WHERE (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 2) OR (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 3) OR (t1.product_id AND t1.id_propertie = 100 AND t1.select_value = 8) HAVING count(product_id) =3 ) t2 WHERE t.product_id = t2.product_id Если требуется показать колоичество записей в выборке, но не хочется выполнять громоздние запросы два раза - сохраните результат поиска во временной таблице, в пользователю покажите таблицу из нее и количество записей в ней.