繁体   English   中英

MySQL按组排序表

[英]MySQL order a table by groups

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

每行都属于一个 级别 = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM