我有一张这样的表
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;
答案 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
子句中聚合函数的结果进行条件测试。