#mysql #sql
#mysql #sql
Вопрос:
Моя таблица: ( validfrom
и validto
и 03JUL2014
ниже все имеют тип DATE
, не STRING
)
id type validfrom validto
-------------------------------------
1 "APPLE" 10MAY2011 15APR2012
1 "APPLE" 19APR2012 15APR2017
1 "ORANGE" 10MAY2011 15APR2012
1 "ORANGE" 19APR2012 15AUG2018
1 "PEAR" 10MAY2012 15APR2013
1 "PEAR" 10MAY2011 15APR2018
2 "APPLE" 10MAY2011 15APR2017
2 "APPLE" 10MAY2011 15APR2012
2 "ORANGE" 10MAY2011 15APR2012
2 "ORANGE" 10MAY2011 15APR2015
2 "ORANGE" 10MAY2007 15APR2019
2 "PEAR" 10MAY2003 15APR2012
2 "PEAR" 10MAY2006 15APR2022
Я хочу получить все записи, где id
есть 2
и validto
больше 03JUL2014
.
Таким образом, я должен получить:
2 "APPLE" 10MAY2011 15APR2017
2 "ORANGE" 10MAY2007 15APR2019
2 "PEAR" 10MAY2006 15APR2022
Я пытался:
SELECT type, validfrom, MAX(validto) FROM crew_qualifications
WHERE id=2 AND validto >= 03JUL2014
Это только дало мне:
2 "PEAR" 10MAY2006 15APR2022
Комментарии:
1. Что такое тип данных
valid_from
иvalid_to
?2. почему вы не сохраняете дату в обычном формате datetime
3. valid_from и valid_to — это даты.
4. alwbtc: форматирование ваших столбцов даты вызывает путаницу среди респондентов. Я бы посоветовал вам удалить оператор MAX () вокруг valid_to, как указано в Appasaheb, ниже, как предложено (предполагая, что validto, показанный здесь, также является опечаткой).
Ответ №1:
В вашем запросе вы пишете MAX(validto), тогда он возвращает только те строки, значение validto которых равно max
вы удаляете MAX (validto), затем он возвращает правильный ответ
Комментарии:
1. Но я хочу получить запись, чей validto больше 03 ИЮЛЯ 2014, и среди них я хочу получить запись с максимальной validto датой
Ответ №2:
Сначала найдите максимальную дату для каждого типа в заданном временном диапазоне. Затем снова объединитесь с вашей таблицей, чтобы получить полную запись.
select cq.type, cq.validfrom, cq.validto
from crew_qualifications cq
join
(
select type, max(validto) as validto
from crew_qualifications
where validto >= '2014-07-03'
group by type
) wanted_cq
on wanted_cq.type = cq.type and wanted_cq.validto = cq.validto;
Что касается вашего запроса: вы выбираете MAX (validto) без групп, поэтому вы получаете MAX (validto) для всей таблицы, то есть для одной записи. Вместе с максимальным значением (validto) вы получаете случайный тип и случайное значение validfrom из вашей таблицы, поскольку вы не указываете, какой тип и значение validfrom вы хотите видеть (минимальное, максимальное или среднее). (Кроме того, validto >= 03JUL2014
должно выдать синтаксическую ошибку. Я удивлен, что это, очевидно, не так. Я не знаю, как MySQL интерпретирует это здесь.)