我想写一个查询,其中给出了一个用户列表的名称(为前)“喜欢”,我想选择所有那些用户都有一个0和“喜欢”栏的1。该模式看起来是这样的:查询根据列条件返回行
id Name Likes
0 Tom 1
1 Alice 0
2 Tom 0
查询应使用id = 0和id返回行= 2,因为汤姆既有1,为柱状0。什么是最简单/最有效的查询来完成这种行为?
我想写一个查询,其中给出了一个用户列表的名称(为前)“喜欢”,我想选择所有那些用户都有一个0和“喜欢”栏的1。该模式看起来是这样的:查询根据列条件返回行
id Name Likes
0 Tom 1
1 Alice 0
2 Tom 0
查询应使用id = 0和id返回行= 2,因为汤姆既有1,为柱状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
子句中枚举它们,并将子选择与数值进行比较。
如果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
我明白你的想法,但你应该加入,我想。 –
@ peter.petrov我不明白你为什么想加入。顺便说一句:许多数据库优化器像外连接一样处理子查询,在这种情况下 - 如果表中有记录 - 则外连接的“外层”永远不会发生。 – FrankPl
好的,可以。只要确保你这样做是有目的的。 –