Mysql - 按日期范围分组

时间:2014-11-12 16:48:29

标签: mysql

测试样本:

CREATE TABLE IF NOT EXISTS test_range (
  `day` DATE,
  `available` INT(11),
  `car_id`  INT(11)
);

INSERT INTO test_range (`day`, `available`, `car_id`) VALUES ('2014-11-20', 5, 1);
INSERT INTO test_range (`day`, `available`, `car_id`) VALUES ('2014-11-21', 5, 1);
INSERT INTO test_range (`day`, `available`, `car_id`) VALUES ('2014-11-22', 3, 1);
INSERT INTO test_range (`day`, `available`, `car_id`) VALUES ('2014-11-23', 5, 2);
INSERT INTO test_range (`day`, `available`, `car_id`) VALUES ('2014-11-24', 5, 2);

我的测试查询:

   SELECT * from test_range
   WHERE day between '2014-11-20' and '2014-11-23'
   AND available > 3
   GROUP BY car_id;

在这种情况下,我想要在此范围内可用的所有汽车,但在第22天汽车不可用,所以我希望它不会出现在结果中。

例如,如果我有天数20,21,22之间的范围,并且我想要一个高于4的可用性,则不应该出现汽车1,因为在第22天它没有。

如何只获得指定范围内所有日期可用的汽车?

3 个答案:

答案 0 :(得分:0)

如果您有唯一的复合索引,则可以查询简单的

SELECT count(*) as count from test_range
WHERE day between '2014-11-20' and '2014-11-26'
GROUP BY car_id
HAVING count = 7;

7是两个日期之间的天数。或者,您可以执行DATEDIFF('2014-11-26','2014-11-20')

答案 1 :(得分:0)

HAVING条款应该可以解决问题,只要你能够计算出你的搜索范围内有多少天(你应该可以很容易地做到这一点)

SELECT * from test_range
   WHERE `day` between '2014-11-20' and '2014-11-26'
     AND `available` > 3
   GROUP BY `car_id`
   HAVING COUNT(*) = DATEDIFF('2014-11-26','2014-11-20')+1;

Example

由于所有天都没有汽车1和汽车2可用,因此只有汽车3(您可以看到我添加并在所有日子都可用)显示在结果中。

答案 2 :(得分:0)

您需要指定不包括

范围内任何日期不可用的汽车
SELECT * FROM test_range WHERE day BETWEEN '2014-11-20' AND '2014-11-23' 
AND available > 3 AND car_id NOT IN 
                                 (SELECT car_id from test_range 
                                  WHERE day between '2014-11-20' and '2014-11-23' 
                                  AND available <= 3)
GROUP BY car_id