2012-11-13 45 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