MySQL 按组对表进行排序

标签 mysql sql-order-by

我有一个表,其中包含字段 idgroupleftlevelcreatedAt

每一行都属于一个level = 0 的行是组“领导者”。

我想按领导者的日期对表格进行排序,并在每个组中按对行进行排序。例如,在此表中:

Id - Group - Left - Level - CreatedAt
1    1       1      0       00:10
2    1       2      1       00:20
3    2       1      0       00:00
4    1       3      1       00:30
5    2       2      1       00:40

顺序应该是:

Id - Group - Left - Level - CreatedAt
3    2       1      0       00:00
5    2       2      1       00:40
1    1       1      0       00:10
2    1       2      1       00:20
4    1       3      1       00:30

因为第 3 行是最新的组领导者,所以它应该位于第一个,后面是按 left 排序的所有组。之后是第 1 行,它是第二个新的领导者,后面是按排序的组。 等等..

我希望我解释得足够清楚。

谢谢!

最佳答案

本质上,您需要将您的表与领导者的时间一起加入:

SELECT my_table.*
FROM   my_table NATURAL JOIN (
  SELECT   my_table.Group, MIN(my_table.CreatedAt) AS LeaderTime
  FROM     my_table
  WHERE    my_table.Level = 0
  GROUP BY my_table.Group
) t
ORDER BY t.LeaderTime, my_table.Left

查看 sqlfiddle .

如果你能够保证每个群体都有一个明确的领导者——例如因为您已经在 (Group, Level) 上定义了 UNIQUE 约束,但您不能拥有该约束,因为您的示例在 Group = 1 中包含两条记录Level = 1——那么你可以避免分组操作:

SELECT   my_table.*
FROM     my_table JOIN my_table AS leader
      ON leader.Group = my_table.Group AND leader.Level = 0
ORDER BY leader.CreatedAt, my_table.Left

关于MySQL 按组对表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365675/

相关文章:

php - 有没有办法用数组数据为sql代码创建foreach

mysql - 错误 145 : Cannot add or update a child row within inserting data into database .。 mysql

mysql - 选择连接输出不完全匹配 [MySQL]

php - JOIN 和 AND 后的订单查询

linq - 通过MvvmCross在SQLite插件上使用多个字段的linq查询“orderby”不起作用

php - 如果多个准备好的语句之一失败,则停止并恢复

mysql - SQL 查询显示基于最小值 + 非重复的行

MySQL 按最近一小时递归计数排序

php - 如何对 foreach 内标题的 $item 值进行排序

linq - Entity Framework -Linq : how query to take 2 first ordered and grouped list