2014-11-12 2 views
1

Тестируемый образец: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 его нет.

Как я могу получить только автомобили, доступные во все дни в пределах данного диапазона?

+0

Вы должны уточнить ваши требования. 'car_id = 2' также недоступен на 22-м, ли это дисквалифицирует его из набора результатов? –

+0

Не могли бы вы рассказать о том, что не так с вашим текущим кодом? Какой результат вы получаете и чего вы ожидаете получить? –

+0

Например, если у меня есть диапазон между днями, 20, 21, 22, и я хочу, чтобы доступность была выше 4, автомобиль 1 не должен появляться, потому что в день 22 его нет. – csdle

ответ

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

Поскольку ни автомобиль, ни один автомобиль 2 доступны на все дней, только автомобиль 3 (который вы можете видеть я добавил и доступны на все дни) показывает, в результате.

+0

Я не могу понять дни, могу ли я сделать это по-другому? – csdle

+0

Вы должны знать диапазон дат, чтобы иметь возможность построить запрос, не так ли? Поэтому вы можете сделать вычитание даты, чтобы получить количество дней. –

+0

У меня есть диапазон да, но у меня много автомобилей, отношений, я не знаю, когда они пересекут, даже с Мин и Макс. но я снова попробую один раз – csdle

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 это количество дней между 2 датами. В качестве альтернативы вы можете сделать DATEDIFF('2014-11-26','2014-11-20')

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 
+0

Это не сработает, если OP хочет исключить автомобиль, у которого нет записи в течение нескольких дней в пределах диапазона дат.Например, если автомобиль должен иметь запись для _all_ дней (которые OP, по-видимому, указал в качестве требования) _and_ on для всех записей 'available' должно быть> 3, это может не исключить некоторые автомобили, которые следует исключить. –

+0

Я согласен с этим, я написал это до того, как csdle упомянул, что автомобили должны были быть доступны каждый день –

Смежные вопросы