0

我有一个包含字段idgroupleftlevelcreatedAt的表。

每一行都属于一个level = 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排序的组。ETC..

我希望我解释得足够清楚。

谢谢!

4

2 回答 2

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那么你可以避免分组操作:

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
于 2012-11-13T17:31:58.023 回答
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;
于 2012-11-13T17:48:11.187 回答