Выберите строку с различным значением и максимальной датой - PullRequest
4 голосов
/ 02 февраля 2012

У меня есть таблица MySQL (5.1.49) с тремя столбцами.

mysql> create table testme(id int auto_increment, id2 int not null, somedate datetime, primary key(id));

В моем случае id2 не является уникальным, но я хочу вернуть строки с различными значениями id2 с максимальным somedate .

Вот некоторые примеры данных.

mysql> insert into testme values (1, 5, '2012-01-02 01:01:01'),(2, 5, '2012-02-02 02:02:02'),(3, 7, '2010-01-10 11:01:33');

Этот вопрос почти отвечает на мой вопрос, но с дополнительным полем id возвращаемые id и id2 не совпадают. Для id2 = 5 возвращается id = 1 вместо id = 2 .

mysql> select id, id2, max(somedate) from testme group by id2;
+----+-----+---------------------+
| id | id2 | max(somedate)       |
+----+-----+---------------------+
|  1 |   5 | 2012-02-02 02:02:02 |
|  3 |   7 | 2010-01-10 11:01:33 |
+----+-----+---------------------+

Я ожидаю,

+----+-----+---------------------+
| id | id2 | max(somedate)       |
+----+-----+---------------------+
|  2 |   5 | 2012-02-02 02:02:02 |
|  3 |   7 | 2010-01-10 11:01:33 |
+----+-----+---------------------+

Требуется идентификатор, который соответствует максимальной дате для каждого ID2

У кого-нибудь есть идеи, пожалуйста? * Спасибо * 1035

Ответы [ 5 ]

8 голосов
/ 02 февраля 2012

Этот запрос определенно будет работать, хотя он может быть не оптимальным:

select t.id, s.id2, s.somedate 
from testme t 
  join 
    ( select id2, max(somedate) as somedate 
      from testme 
      group by id2
    ) s 
    on  s.id2 = t.id2 
    and s.somedate = t.somedate;
1 голос
/ 08 марта 2012

Когда речь идет о получении максимальной даты в наборе записей, не рекомендуется объединять max(date) с другими строками.Конечно, вы всегда получите max(date), но другие поля будут первым появлением в этом наборе.Вот ответ на ваш вопрос, используя вашу таблицу в качестве примера:

+----+-----+---------------------+
| id | id2 |    somedate         |
+----+-----+---------------------+
|  1 |   5 | 2012-01-02 01:01:01 |
|  2 |   5 | 2012-02-02 02:02:02 |
|  3 |   7 | 2010-01-10 11:01:33 |
+----+-----+---------------------+
select id, id2, somedate from testme t1
where somedate = 
(select max(somedate) from testme t2 where t2.somedate = t1.somedate) 
order by somedate desc
1 голос
/ 02 февраля 2012

Альтернативное решение вашей проблемы:

SELECT t0.id, t0.id2, t0.somedate 
FROM testme AS t0 
LEFT JOIN testme AS t1 
    ON t0.id2 = t1.id2 
    AND t1.somedate > t0.somedate
WHERE t1.id IS NULL;

Как и в случае решения @itsmeee, если id2, somedate пары не уникальны, будут выведены обе строки:

+----+-----+---------------------+
| id | id2 | somedate            |
+----+-----+---------------------+
|  4 |   8 | 2012-02-02 02:02:02 |
|  6 |   8 | 2012-02-02 02:02:02 |
+----+-----+---------------------+

Если id2, somedate пары не являются уникальными, и по какой-то причине вам нужен только один результат на id2, вы можете позволить MySQL выбрать одну для вас с дополнительным предложением GROUP BY t0.id2.Но имейте в виду, что это нестандартное поведение SQL.

0 голосов
/ 02 февраля 2012
select id2, max(id), max(somedate) from testme group by id2;
0 голосов
/ 02 февраля 2012

Не уверен, но, основываясь на вашем примере, попробуйте это:

select max(id) as Id,id2,max(someDate) from testMe group by Id2
...