测试样本:
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天它没有。
如何只获得指定范围内所有日期可用的汽车?
答案 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;
由于所有天都没有汽车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