[英]MySQL order a table by groups
我有一个表,其中包含字段id , group , left , level和createdAt 。
每行都属于一个组 。 级别 = 0的行是组“领导者”。
我想按领导者的日期对表格进行排序,并在每个组中按left对行进行排序。 例如,在此表中:
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行,它是第二新的领导者,其后是按left排序的组。 等等..
我希望我解释得足够清楚。
谢谢!
本质上,您需要根据领导者的时间加入表格:
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, Level)
因为您的示例在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
为了对组长的createdAt进行排序,您可以将每一行连接到描述组长的行,然后进行排序:
SELECT t1.*
FROM my_table t1
INNER JOIN my_table t2
ON t1.Group = t2.Group AND t2.Level = 0
ORDER BY t2.CreatedAt, t1.Left;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.