我需要使用(My)SQL解决以下问题,给出的是此示例表:
id | item | start | end
1 | 100 | 2015-01-01 | 2015-01-14
2 | 100 | 2015-01-01 | NULL
3 | 101 | 2015-03-01 | 2015-04-15
4 | 101 | 2015-04-17 | 2015-04-22
5 | 101 | 2015-04-27 | 2015-05-11
我需要一个查询,它会向我提供没有开放结束日期的所有项目。因此,从上面我可以得到101。
我尝试使用GROUP和一些子选择,但没有像我预期的那样出现。对此有何帮助?
答案 0 :(得分:2)
您可以使用group by
和having
:
select item
from example
group by item
having count(end) = count(*);
带有列名的 count()
计算非NULL
值的数量。如果这等于行数,则没有值为NULL
。
你也可以使用:
having sum(end is null) = 0
编辑:
我应该补充一点,假设您有正确的索引和项目表,以下内容可能会更快:
select i.item
from items i
where not exists (select 1
from example e
where i.item = e.item and e.end is null
);
为了提高性能,您需要example(item, end)
上的索引。