Точный подход, который вы должны предпринять, будет зависеть от ваших больших требований. Вот одно из возможных решений:
SELECT
product_id
FROM
Some_Table
WHERE
flag_id IN (1, 2)
GROUP BY
product_id
HAVING
COUNT(*) = 2
Это работает, пока у вас не может быть дубликатов. Если товар может быть помечен дважды с одним и тем же flag_id, вам понадобится:
SELECT
product_id
FROM
Some_Table
WHERE
flag_id IN (1, 2)
GROUP BY
product_id
HAVING
COUNT(DISTINCT flag_id) = 2
В обоих этих случаях вам потребуется GROUP BY
, чтобы соответствовать вашему списку столбцов. MySQL не требует этого для выполнения запроса (недостаток IMO, но я сохраню этот аргумент в другой раз), но результаты не будут определены для столбцов, не входящих в GROUP BY
. Вы также можете использовать вышеизложенное для запросов как подзапросов, которые затем можно присоединить к другой таблице или таблицам.
Если вы знаете, что всегда будет ровно два флага, для которых вы ищете, вы можете использовать EXISTS:
SELECT
T1.product_id
FROM
Some_Table T1
WHERE
EXISTS (
SELECT *
FROM
Some_Table T2
WHERE
T2.product_id = T1.product_id AND
T2.flag_id = 1
) AND
EXISTS (
SELECT *
FROM
Some_Table T2
WHERE
T2.product_id = T1.product_id AND
T2.flag_id = 2
)
Хотя производительность может быть не очень хорошей.