2012-11-13 31 views
0

表我有一個表中的字段ID離開水平createdAtmysql命令按組

每行都屬於。具有級別 = 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是最新的組長,它應該是第一,其次是所有下令小組離開 。之後是排在第一位的第二位新領導者,緊接着是左邊的。 等..

我希望我解釋清楚。

謝謝!

+1

通常應該避免使用組列名,因爲它是一個MySQL的保留字,看到的是https://開發。 mysql.com/doc/refman/5.5/en/reserved-words.html – Gunner

+0

是的,你說得對,我沒有那個專欄名稱,只是爲了讓問題更簡單。 – tamir

回答

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 
+0

優秀!謝謝 – tamir

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; 
+0

如果有多個組長,會發生什麼? – eggyal

+0

@eggyal答案沒有指定(因爲問題意味着每個組都有_one_ leader),在這種情況下返回重複的行。 –

+0

事實上 - 值得澄清,特別是因爲這個例子證明'(Group,Level)'不是唯一的。 – eggyal