我的表格中包含 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行,这是第二个最新的领导者,其次是由左排序的组。 等。
我希望我能够清楚地解释清楚。
谢谢!
答案 0 :(得分: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上查看。
如果你能保证每个群体都有一个明确的领导者 - 例如。因为您已在UNIQUE
上定义了(Group, Level)
约束,但由于您的示例在Group = 1
中包含Level = 1
的两条记录,因此您不能拥有该约束 - 然后您可以避免分组操作:< / p>
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
答案 1 :(得分:0)
为了对组长的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;