按最近日期的 ID 排序结果

Order result by IDs with the most recent date

我试了很多,但我想不出办法:

我有一个 table,其中包含(不是唯一的)ID 和日期。最后应该全部选中,但需要排序。

Table:

+----+------------+
| id |    date    |
+----+------------+
|  1 | 2017-12-10 |
|  1 | 2015-05-22 |
|  7 | 2016-04-05 |
|  2 | 2017-12-12 |
|  2 | 2014-03-10 |
|  7 | 2016-01-14 |
|  1 | 2016-08-17 |
+----+------------+

我需要的:

+----+------------+
| id |    date    |
+----+------------+
|  2 | 2017-12-12 |
|  2 | 2014-03-10 |
|  1 | 2017-12-10 |
|  1 | 2016-08-17 |
|  1 | 2015-05-22 |
|  7 | 2016-04-05 |
|  7 | 2016-01-14 |
+----+------------+

我需要所有 "grouped" ID,从链接到最近日期的 ID 开始。

id: 2 / date: 2017-12-12

有最近的日期,所以现在所有 ID 为 2 的行都在后面,按日期降序排列。之后,下一个 "block" 个 ID 由下一个最近的日期再次确定,依此类推。

如果你的table是stack

SELECT * FROM `stack` LEFT OUTER JOIN (SELECT  * FROM `stack` GROUP BY `id` )t1 ON
`stack`.`id` = t1.`id` ORDER BY t1.`date` DESC,`stack`.`date` DESC

使用按 id 分组的子查询,我们得到最大日期,然后将其连接到源数据给我们每行的最大日期作为排序依据。

SQL Fiddle

MySQL 5.6 架构设置:

CREATE TABLE Table1
    (`id` int, `date` datetime)
;

INSERT INTO Table1
    (`id`, `date`)
VALUES
    (1, '2017-12-10 00:00:00'),
    (1, '2015-05-22 00:00:00'),
    (7, '2016-04-05 00:00:00'),
    (2, '2017-12-12 00:00:00'),
    (2, '2014-03-10 00:00:00'),
    (7, '2016-01-14 00:00:00'),
    (1, '2016-08-17 00:00:00')
;

查询 1:

select t.*
from table1 t
inner join (
  select id, max(`date`) maxdate
  from table1
  group by id
  ) g on t.id = g.id
order by g.maxdate DESC, t.id, t.date DESC

Results:

| id |                 date |
|----|----------------------|
|  2 | 2017-12-12T00:00:00Z |
|  2 | 2014-03-10T00:00:00Z |
|  1 | 2017-12-10T00:00:00Z |
|  1 | 2016-08-17T00:00:00Z |
|  1 | 2015-05-22T00:00:00Z |
|  7 | 2016-04-05T00:00:00Z |
|  7 | 2016-01-14T00:00:00Z |