选择同时包含多个条件的行

时间:2009-03-27 16:49:22

标签: mysql conditional-statements

我有这样的表结构:

ID   cond
1    5
1    2
1    6
8    2
9    1
9    5

当我想选择包含一个或多个条件的行时,我使用OR (... WHEN cond = 2或cond = 6 GROUP BY ID ...)

但是如何选择包含多个条件的行同时按ID分组? 例如。当我想要找到包含cond 2和6的行时,它只返回ID 1

由于

7 个答案:

答案 0 :(得分:3)

您可以使用联接:

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

答案 1 :(得分: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则没有其他cond,那么下面改为阅读{{1将表现最佳)

  

SELECT id, GROUP_CONCAT(DISTINCT cond ORDER BY cond) AS conds ... WHERE conds='2,6'

答案 2 :(得分:1)

您可以使用子查询和组来执行此操作。假设您知道需要查找的值的数量,您可以这样做:

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子句(即“有计数(t) .cond)= 2“)等于值的总数。

答案 3 :(得分:0)

SELECT DISTINCT(ID) WHERE (cond = 2) OR (cond = 6)

答案 4 :(得分:0)

这是另一种语法,它对于它正在做的事情更加透明(尽管不是高效)。

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)

答案 5 :(得分:0)

如果每个ID没有重复,这可能会更灵活。

SELECT id
FROM tbl 
GROUP BY id
HAVING SUM(CASE cond 
    WHEN 2 THEN 1
    WHEN 6 THEN 1
    ELSE 0 END) > 1

答案 6 :(得分:0)

您是否考虑过使用UNION条款?

SELECT ID 来自MyTable WHERE cond = 2 联盟 选择ID 来自MyTable WHERE cond = 6

如果您可以指定要查找的确切输出,也会有所帮助。但根据我的理解,UNION将是最佳选择。