0

フィールドidgroupleftlevelcreatedAtのテーブルがあります。

すべての行はグループに属しています。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は最新のグループリーダーであるため、最初に行の後に、左から順に並べられたすべてのグループが続く必要があります。その後、2番目に新しいリーダーである行1が続き、左から順に並べられたグループが続きます。等..

私はそれを十分に明確に説明したと思います。

ありがとう!

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)、例に2つのレコードが含まれているために定義できない場合) 、グループ化操作Group = 1Level = 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 に答える