2013-10-22 4 views
3

У меня есть следующие в моей БД:MySQL получить последнюю дату записи из нескольких

ID  datetime    type value 
1094 2013-09-25 09:11:18 HDD  89% 
1094 2013-09-25 09:11:18 CPU  55% 
1093 2013-09-25 09:11:18 HDD  77% 
1093 2013-09-25 09:11:18 CPU  55% 
1094 2013-09-25 08:21:28 HDD  85% 
1094 2013-09-25 08:21:28 CPU  11% 
1093 2013-09-25 07:04:00 HDD  76% 

Я хочу, чтобы получить последнюю дату для каждого ID и тип записи:

1094 2013-09-25 09:11:18 HDD  89% 
1094 2013-09-25 09:11:18 CPU  55% 
1093 2013-09-25 09:11:18 HDD  77% 
1093 2013-09-25 09:11:18 CPU  55% 
+0

Дубликат [Получить последнюю дату из сгруппированных данных MySQL] (http://stackoverflow.com/questions/8470311/get-the-latest-date-from-grouped-mysql-data) , но ответ fancyPants здесь лучше, чем ответы в старом вопросе. –

ответ

11

You может использовать GROUP BY, но важно понять, как это работает.

Когда вы используете GROUP BY, группа строк сворачивается в одну и то, что отображается в других столбцах, которые не используются в вашем предложении GROUP BY, определяется либо с помощью агрегатных функций, либо это случайная строка из этой группы , Вы не можете быть уверены в том, что строка, соответствующая отображаемой строке, будет содержать значение MAX() или любую другую функцию, которую вы использовали. Это становится особенно очевидным, когда вы делаете запрос типа:

SELECT id, MIN(whatever), MAX(whatever), another_column 
FROM your_table 
GROUP BY id 

«another_column» может принадлежать к строке, содержащей значение MIN() или значение MAX() или даже в другой строке не отображается вообще. В других СУБД, кроме MySQL, фактически запрещается выбирать столбцы, которые не используют агрегированную функцию, или не указаны в предложении GROUP BY, просто чтобы пользователи не ошиблись или считают, что они получили правильный результат.

Итак, в вашем случае вы, похоже, хотите также отобразить столбец «значение». По вышеуказанным причинам ответ juergen_d неверен, потому что он не выбирает «значение», и если бы это было так, вы не можете быть уверены, что это правильное «значение». Ответ Филипе Сильвы неверен, потому что он группируется по «ценности». Выполнение этого в вашем случае фактически вернет всю таблицу. Ответ Ромеша неверен, потому что, используя в два раза функцию MAX(), вы получите максимальные значения, но не значение, соответствующее значению даты и времени.

Итак, как вам это сделать? Here 3 ways are described. Изучите их, применив их самостоятельно. Это не так сложно :)

3
select id, type, max(datetime) 
from your_table 
group by id, type 
+3

Пожалуйста, будьте осторожны, что ответ Юргена неверен (как объясняется далее ниже fancyPants). – fuji2015

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