mysql查询选择满足给定输入范围和多个输入的所有行

时间:2015-03-09 19:23:04

标签: mysql sql where multiple-select

我需要找到满足输入值列表给定条件的行数。

假设我们有一个包含列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')等,我该怎么办?

虽然我浏览了很多帖子,但找不到这类问题的答案。可以在一个选择查询中完成吗?

1 个答案:

答案 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;