我有这样的表结构:
ID cond
1 5
1 2
1 6
8 2
9 1
9 5
当我想选择包含一个或多个条件的行时,我使用 OR (...WHEN cond=2 OR cond=6 GROUP BY ID...)
但是如何选择包含多个同时按 ID 分组的条件的行呢?例如,当我想查找包含 cond 2 和 6 的行时,它只返回 ID 1
谢谢
我有这样的表结构:
ID cond
1 5
1 2
1 6
8 2
9 1
9 5
当我想选择包含一个或多个条件的行时,我使用 OR (...WHEN cond=2 OR cond=6 GROUP BY ID...)
但是如何选择包含多个同时按 ID 分组的条件的行呢?例如,当我想查找包含 cond 2 和 6 的行时,它只返回 ID 1
谢谢
您可以为此使用连接:
SELECT ID
FROM tbl t1
INNER JOIN
tbl t2
ON t1.ID = t2.ID
WHERE t1.cond = 2
AND t2.cond = 6
或者,如果 ID/cond 对是唯一的:
SELECT ID
FROM tbl
WHERE cond IN (2, 6)
GROUP BY ID
HAVING COUNT(cond) = 2
有多种方法可以做到这一点。
使用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
(COUNT 主题上的 MySql 特定变体,但如果您想要完全匹配,例如 cond=2 和 cond=6 没有其他条件,那么下面的更改为 readSELECT 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
您可以使用子查询和组来执行此操作。假设您知道需要查找的值的数量,您可以这样做:
select
t.ID
from
(
select distinct
ID, cond
from
tbl
where
tbl.cond in (2, 6)
) as t
group by
t.ID
having
count(t.cond) = 2
对于一般情况,您只需更新必须存在的条件列表(即“(2, 6)”)以包含新值,然后更新 having 子句(即“have count(t.cond) = 2") 等于值的总数。
SELECT DISTINCT(ID) WHERE (cond = 2) OR (cond = 6)
这是另一种语法,它对它的作用更加透明(尽管性能不高)。
SELECT DISTINCT ID
FROM MyTable T
WHERE
EXISTS(SELECT ID FROM MyTable T1 WHERE Cond=2 AND T1.ID=T.ID) AND
EXISTS(SELECT ID From MyTable T2 WHERE Cond=6 AND T2.ID=T.ID)
如果每个 id 没有重复,这可能会更灵活一些。
SELECT id
FROM tbl
GROUP BY id
HAVING SUM(CASE cond
WHEN 2 THEN 1
WHEN 6 THEN 1
ELSE 0 END) > 1
您是否考虑过使用 UNION 子句?
从 MyTable 中选择 ID WHERE cond = 2 UNION 从 MyTable 中选择 ID WHERE cond = 6
如果您可以指定您正在寻找的确切输出,这也会有所帮助。但据我了解,UNION 将是要走的路。