2014-09-02 37 views
1

示例表:集团通过与多个有在同一领域

a | b 
----- 
1 | 1 
1 | 2 
2 | 1 
3 | 0 
3 | 1 
4 | 1 
4 | 2 
4 | 3 
5 | 0 

我想获得列a,这是与值从列b,其中b = 1 AND b = 2相关的所有DISTINCT值。

结果应该是:

a 
- 
1 
4 

是否与GROUP BY这项工作?我尝试以下SQL,但它给始终为0的结果:

SELECT t.a 
FROM table t 
GROUP BY t.a, t.b 
HAVING t.b = 1 AND t.b = 2 

的MySQL似乎需要在同一行,而不是在分组bAND声明。

任何想法? :)

回答

2

你非常接近。试试这个:

SELECT t.a 
FROM table t 
GROUP BY t.a 
HAVING SUM(t.b = 1) > 0 AND SUM(t.b = 2) > 0; 

SUM()条件计算中条件正确的行数。你想要两个,因此> 0AND

编辑从做如下的GROUP BY

+0

呀。有时候你会错过树林......谢谢。 **编辑**你必须从'GROUP BY'中删除't.b'。事后我会接受这个。 – 2014-09-02 18:11:02

1

一种方法去除t.b

SELECT t.a 
FROM table t 
GROUP BY t.a 
HAVING SUM(CASE WHEN b=1 THEN 1 ELSE 0 END) <> 0 
    AND SUM(CASE WHEN b=2 THEN 1 ELSE 0 END) <> 0 

请注意,您需要删除从GROUP BYt.b,否则结果将是不正确的。

Demo.

1

这应该做的伎俩:

SELECT t.a 
FROM table t 
WHERE (t.b = 1 OR t.b = 2) 
GROUP BY t.a 
HAVING COUNT(t.a) > 1 
+0

这也适用。谢谢:) – 2014-09-02 18:16:21

+0

请注意,该查询只在假设表中没有重复的'(a,b)'元组的假设下工作。例如,如果向OP的表中添加一个重复的“(2,1)”记录,则会在输出中添加“2”([demo](http://www.sqlfiddle.com/#!2/) 2分之22535))。 – dasblinkenlight 2014-09-02 18:21:20

+0

好点!所以这个答案只适用于具有'UNIQUE(a,b)'约束的数据集,对于这个问题没关系,但应该提到。 – 2014-09-02 20:43:53

0

您可以简单地使用子查询是这样的:

select a from t where b=1 and a in (select a from t where b=2);