按最近日期的ID订购结果

时间:2017-12-10 03:38:40

标签: mysql sql-order-by

我尝试了很多,但我无法想办法做到这一点:

我有一张表(不是唯一的)ID和日期。最后应选择所有条目,但需要对它们进行排序。

表:

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

我需要通过ID“分组”所有内容,从最近日期与之关联的ID开始。

id: 2 / date: 2017-12-12

具有最新日期,因此现在所有具有Id 2的行都按照日期降序排序。之后,下一个最近的日期会再次确定下一个“阻止”ID,依此类推。

2 个答案:

答案 0 :(得分:2)

使用按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 |

答案 1 :(得分:-1)

如果您的表格为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