2014-01-23 68 views
1

我想写一个查询,其中给出了一个用户列表的名称(为前)“喜欢”,我想选择所有那些用户都有一个0和“喜欢”栏的1。该模式看起来是这样的:查询根据列条件返回行

id Name Likes 
0 Tom 1 
1 Alice 0 
2 Tom 0 

查询应使用id = 0和id返回行= 2,因为汤姆既有1,为柱状0。什么是最简单/最有效的查询来完成这种行为?

回答

0

假设你的表称为tab,你可以使用:

SELECT * 
    FROM tab a 
WHERE (SELECT count(distinct b.likes) 
     FROM tab b 
     WHERE a.name = b.name 
      AND b.likes in(0, 1) 
     ) = 2 

这可以很容易地扩展到任意数量的要求不同喜好的。只需在IN子句中枚举它们,并将子选择与数值进行比较。

+0

我明白你的想法,但你应该加入,我想。 –

+0

@ peter.petrov我不明白你为什么想加入。顺便说一句:许多数据库优化器像外连接一样处理子查询,在这种情况下 - 如果表中有记录 - 则外连接的“外层”永远不会发生。 – FrankPl

+0

好的,可以。只要确保你这样做是有目的的。 –

2

如果Likes在您的表中只能是1或0,那么您可以这样做。

select distinct t1.Name From tableName t1 
join tableName t2 on t1.name = t2.name and t1.Likes = 1 - t2.Likes 

如果情况并非如此,只是这样做:

select distinct t1.Name From tableName t1 
join tableName t2 on t1.name = t2.name and t1.Likes = 1 and t2.Likes = 0 

另一种可能的解决方案是这一个。

select a.* from 
tableName a 
JOIN 
(
    select b.Name, count(distinct b.likes) as Likes 
    from tableName b 
    group by b.Name 
    having count(distinct b.likes) > 1 
) a1 on a.Name = a1.Name