【问题标题】:Order by datetime but other field no consecutive按日期时间排序,但其他字段不连续
【发布时间】:2018-08-02 07:28:33
【问题描述】:

我不是 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 来实现这一点的答案,如果不可能,我将不得不在 php 中完成。

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

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

【问题讨论】:

  • 我对您的示例数据和预期结果感到困惑 - 您的数据真的按每行 3 个日期时间、id 组织吗?为什么引用日期时间字段?
  • 是的,很抱歉,我还不知道如何做好事,我认为现在更清楚了,由 3 个组分隔,只是因为示例中只有 3 个 id,只是为了最佳阅读
  • 如果我不知道如何格式化数据,我想我会尝试随机按下所有按钮,看看会发生什么
  • 什么决定了哪个 a/b/c 条目在哪个 abc 组中?我的意思是2018-07-14 23:03:57 的值可以在三个组中的任何一个中。为什么是第一个?
  • 非常感谢您或编辑,抱歉。

标签: mysql database sql-order-by


【解决方案1】:

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

  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

【讨论】:

  • 我无话可说,非常感谢,我真的很感激,确实我修改了一些语法,但是通过示例和链接,它很容易做到!
  • 是的!它在没有子查询的情况下完美运行,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-09-02
  • 2014-06-29
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多