组查询结果,其中不包括标志

时间:2018-04-11 17:42:34

标签: mysql

我有一张这样的表

NAME    FLAG
---------------------------
abc     1
abc     0
abc     2
def     1
def     2
xyz     0
xyz     0
xyz     1
efg     1

我需要查询列出名称(组结果)哪个标志不包括0并包括1.结果如下: -

NAME    FLAG
------------------
def     1
efg     1

我已经尝试了查询但结果不一样。

select * mytable where FLAG NOT IN (0) GROUP BY NAME;

3 个答案:

答案 0 :(得分:0)

这是我能想到的最简单的解决方案。我相信有更优雅的答案可能。

SELECT * 
FROM mytable 
WHERE name NOT IN (SELECT name FROM mytable WHERE flag = 0)
    AND flag = 1;

答案 1 :(得分:0)

您可以这样使用NOT EXISTS子句。

select a.*
from tbl a
where not exists 
 (select *
  from tbl b
  where b.name=a.name 
   and b.flag=0)
and a.flag=1;

答案 2 :(得分:0)

我们可以使用聚合。诀窍是在每一行上运行一个条件,然后使用一个聚合函数从所有行中挑选出条件的最终结果......

SELECT t.name
  FROM a_table_like_this t
 GROUP BY t.name
HAVING MAX(t.flag=0) <> 1
   AND MAX(t.flag=1)  = 1

HAVING子句中的表达式是MySQL的简写。 更符合ANSI标准的等效标准是:

SELECT t.name
  FROM a_table_like_this t
 GROUP BY t.name
HAVING MAX( CASE WHEN t.flag=0 THEN 1 ELSE 0 END) <> 1
   AND MAX( CASE WHEN t.flag=1 THEN 1 ELSE 0 END)  = 1

为了更好地处理这项工作,请查看每行上如何计算这些表达式。删除GROUP BY子句,并将这些表达式移到SELECT列表中......

SELECT t.name
     , t.flag
     , CASE WHEN t.flag=0 THEN 1 ELSE 0 END AS `fl=0`
     , CASE WHEN t.flag=1 THEN 1 ELSE 0 END AS `fl=1` 
  FROM a_table_like_this t
 ORDER
    BY t.name
     , t.flag

我们得到像

这样的东西
name    flag  fl=0  fl=1
------  ----  ----  ----
abc     1     0     1
abc     0     1     0
abc     2     0     0
def     1     0     1
def     2     0     0
xyz     0     1     0
xyz     0     1     0
xyz     1     0     1
efg     1     0     1

如果我们现在按名称(GROUP BY name)汇总这些行,我们可以使用MAX()汇总来挑选1(如果组中有一个。否则,我们会取回0。)

我们可以对HAVING子句中聚合函数的结果进行条件测试。