按日期时间排序,但其他字段不连续

时间:2018-08-02 07:28:34

标签: mysql database sql-order-by

我不是MySQL方面的专家,我想知道这是否有可能,或者我是否应该在php中做...

我想按日期时间排序,但按ID组分开

我有这张桌子:

(SELECT created_at, id FROM table ORDER BY created_at)


2018-07-14 23:03:57    a
2018-07-15 01:15:25    a
2018-07-15 03:02:46    a

2018-08-02 06:00:14    b
2018-08-02 06:00:35    b
2018-08-02 06:00:38    b

2018-08-02 06:01:38    c
2018-08-02 06:01:41    c
2018-08-02 06:01:44    c

我需要这样的结果:

2018-07-14 23:03:57 a
2018-08-02 06:00:14 b
2018-08-02 06:01:38 c

2018-07-15 01:15:25 a
2018-08-02 06:00:35 b
2018-08-02 06:01:41 c

2018-07-15 03:02:46 a
2018-08-02 06:00:38 b
2018-08-02 06:01:44 c

我一直在尝试和搜索很久了,如果没有可能,我将找不到只能通过MySQL实现此目标的答案。

谢谢你们!祝你有美好的一天

编辑:我不知道如何在stackoverflow中做一个漂亮的表,对不起:(

1 个答案:

答案 0 :(得分:0)

这是可行的,但并不漂亮。工作流程基本上是这样的:

  1. 先按ID排序,然后按created_at
  2. 包括一个行号,该行号在ID更改时会重置
  3. 按照外部查询顺序按行号,然后按created_at

查询看起来像这样(我想...未经测试):

SELECT id, created at 
FROM (
    SELECT id, 
    created_at,
    @rownum := IF(@prev_id != id, 1, @rownum + 1) AS rownum,
    @prev_id := id
    FROM table 
    , (SELECT @rownum := 0, @prev_id := NULL) var_init_subquery
    ORDER BY id, created_at
) sq
ORDER BY rownum, created_at, id

不过,在MySQL 8中,可以使用窗口函数来完成此操作。

我想应该这样做:

SELECT id, 
created_at,
ROW_NUMBER() OVER (created_at PARTITION BY id) AS rownum
FROM table 
ORDER BY rownum, created_at, id

如果不是100%正确的语法,请查阅手册:https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number