MySQL按组排序表

时间:2012-11-13 17:30:37

标签: mysql sql-order-by

我的表格中包含 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行,这是第二个最新的领导者,其次是由排序的组。 等。

我希望我能够清楚地解释清楚。

谢谢!

2 个答案:

答案 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;