我有一个表,其中包含字段 id、group、left、level 和 createdAt 。
每一行都属于一个组。 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/