Есть несколько способов сделать это.
Использование COUNT
(самый быстрый):
SELECT id FROM tbl WHERE tbl.cond IN ( 2, 6 ) HAVING COUNT(DISTINCT cond) = 2 GROUP BY id
Использование EXISTS
(использование вложенных циклов, медленнее на очень больших таблицах, но менее криптографически и более расширяемо, чем вариант COUNT
):
SELECT DISTINCT id FROM tbl AS tbl1 WHERE EXISTS (SELECT * FROM tbl AS tbl2 WHERE tbl1.id = tbl2.id AND tbl2.cond = 2) AND EXISTS (SELECT * FROM tbl AS tbl2 WHERE tbl1.id = tbl2.id AND tbl2.cond = 6)
Использование GROUP_CONCAT
(MySql-специфическая вариация для темы COUNT, но если вам когда-нибудь понадобятся точные совпадения, например, cond = 2 и cond = 6, то нет другого cond, тогда приведенные ниже изменения, измененные на SELECT id, GROUP_CONCAT(DISTINCT cond ORDER BY cond) AS conds ... WHERE conds='2,6'
, будут выполняться лучший)
SELECT id, ','||GROUP_CONCAT(DISTINCT cond)||',' AS conds FROM tbl WHERE INSTR(conds, ',2,') > 0 AND INSTR(conds, ',6,') > 0 GROUP BY id