Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据列条件返回行的查询_Mysql_Sql - Fatal编程技术网

Mysql 根据列条件返回行的查询

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

我正在尝试编写一个查询,其中给定一个列名称为(例如)“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 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我发现这样做很容易理解,而且不需要使用连接时需要的明确的
分组依据。