Mysql 根据列条件返回行的查询
我正在尝试编写一个查询,其中给定一个列名称为(例如)“Likes”的用户表,我希望为“Likes”列选择所有记录为0和1的用户。架构如下所示:Mysql 根据列条件返回行的查询,mysql,sql,Mysql,Sql,我正在尝试编写一个查询,其中给定一个列名称为(例如)“Likes”的用户表,我希望为“Likes”列选择所有记录为0和1的用户。架构如下所示: id Name Likes 0 Tom 1 1 Alice 0 2 Tom 0 查询应该返回id=0和id=2的行,因为Tom的Like列同时有1和0。完成这种行为的最简单/最有效的查询是什么?如果表中的Likes只能是1或0,而没有其他值,则可以执行此操作 select distinct t1.Name From tableN
id Name Likes
0 Tom 1
1 Alice 0
2 Tom 0
查询应该返回id=0和id=2的行,因为Tom的Like列同时有1和0。完成这种行为的最简单/最有效的查询是什么?如果表中的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
假设您的表名为
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
这可以很容易地扩展到所需的任何数量的不同类。只需在子句中的
中列举它们,并将子选择与值的数量进行比较。我明白你的想法,但你还是应该加入,我想。@peter.petrov我不明白你为什么要加入。顺便说一句:许多数据库优化器像处理外部联接一样处理子选择,在这种情况下-如果表中有记录-外部联接的outer
将永远不会发生。好的,可能会发生。只要确保你是故意这样做的。@peter.petrov我发现这样做很容易理解,而且不需要使用连接时需要的明确的分组依据。