我需要找到满足输入值列表给定条件的行数。
假设我们有一个包含列id,open_date,close_date。
的表请求表
id open_date close_date
1 '2013-04-08' '2013-04-10'
2 '2013-04-11' '2013-04-12'
1 '2013-04-09' '2013-04-12'
1 '2013-04-10' '2013-04-12'
现在我想要满足给定输入x的条件的行数(x是输入列表中的值之一),使得x> open_date和x< close_date。
这可以对列表的单个条目进行,x如下所示
SELECT count(*) FROM request WHERE '2013-04-10' BETWEEN open_date AND close_date
但如果对于所有x,其中x是列表中的条目(' 2013-04-10',' 2013-04-12')等,我该怎么办?
虽然我浏览了很多帖子,但找不到这类问题的答案。可以在一个选择查询中完成吗?
答案 0 :(得分:2)
不推荐:以编程方式生成大量查询:
SELECT count(*) FROM request WHERE
'2013-04-10' BETWEEN open_date AND close_date OR
'2013-05-10' BETWEEN open_date AND close_date OR
....
'2015-11-4' BETWEEN open_date AND close_date
注意:这会给你一个总数。如果你想要每个日期的总数,你需要第二种方式。
推荐但有点复杂。将日期放在一个包含一列的表中,组合它们,仅过滤掉匹配的集合,然后将它们组合在一起进行计数。
SELECT q.date, COUNT(*) FROM test_dates q, request r
WHERE q.date BETWEEN r.open_date AND r.close_date
GROUP BY q.date;
Demo sqlfiddle:http://sqlfiddle.com/#!9/474bb/3
编辑:
我认为实际上要求此变体将计算其范围包括任何测试日期的行数:
SELECT COUNT(*) FROM
(SELECT DISTINCT r.id FROM test_dates q, request r
WHERE q.date BETWEEN r.open_date AND r.close_date) t;