按日期时间排序但其他字段不连续
Order by datetime but other field no consecutive
我不是 MySQL 方面的专家,我想知道这是否可能,或者我是否应该在 php...
我想按日期时间排序,但按 ID 组分隔
我有这个table:
(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 实现此目的的答案,如果不可能,我将不得不在 php 中完成.
谢谢大家!祝你有美好的一天
编辑:我不知道如何在 Whosebug 中做得很好 table,抱歉 :(
这是可行的,但不是很漂亮。工作流程基本上是这样的:
- 先按id排序,然后created_at
- 包含一个在 id 更改时重置的行号
- 按行号外查询顺序,然后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 中,这可以用 window 函数做得更漂亮。
我想应该这样做:
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
我不是 MySQL 方面的专家,我想知道这是否可能,或者我是否应该在 php...
我想按日期时间排序,但按 ID 组分隔
我有这个table:
(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 实现此目的的答案,如果不可能,我将不得不在 php 中完成.
谢谢大家!祝你有美好的一天
编辑:我不知道如何在 Whosebug 中做得很好 table,抱歉 :(
这是可行的,但不是很漂亮。工作流程基本上是这样的:
- 先按id排序,然后created_at
- 包含一个在 id 更改时重置的行号
- 按行号外查询顺序,然后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 中,这可以用 window 函数做得更漂亮。
我想应该这样做:
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