2017-08-28 108 views
0

我与字段的表:MySQL的排序DESC和ASC

id | group_id 
1 | null 
2 | null 
3 | null 
4 | 4 
5 | 4 
6 | 4 
7 | 7 
8 | 7 
9 | null 

,我想对它进行排序是:

id | group_id 
9 | null 
7 | 7 
8 | 7 
4 | 4 
5 | 4 
6 | 4 
3 | null 
2 | null 
1 | null 

所以它通过ID来整体DESC ,但ID ASC当他们共享一个GROUP_ID

谢谢

+0

我不认为是可能的,通过一个简单的命令。基本上你不能同时对一个字段的多个方向进行排序(一些值为asc和一些desc)。你需要重新思考你的问题并以不同的方式分析它。 – Lamar

+0

@Lamar如果有人有一个聪明的方法来解决问题,我会留下这个问题,但我会在这里重新考虑我的问题,试图以另一种方式分解它。谢谢 – arthur

+0

组ID是否可以高于ID?例如。可以'id = 1,group_id = 12'是一个有效的条目(它应该在底部排序?)是否有可能有一个组ID为ID为组ID为'null' ? (例如,可以有'id = 10,group_id = 9'和'id = 9,group_id = null'? – Solarflare

回答

2

试试看

Select id, group_id, coalesce(group_id, id) from table order by 3 desc, 1 
0

我不知道你能做到的ID列的乱序排序,BU ■如果你需要的是在组ID是共享的,然后更新@奥多姆的回答这样会做最低的ID它

SELECT MIN(id) AS id, group_id FROM table 
GROUP BY group_id 
ORDER BY IFNULL(group_id, 0) DESC, id DESC 
+0

这将我的结果按组ID分组,我不想要任何“分组”行,我只是想要它们在其“组”列中排序 – arthur

2

我得到这个工作:

SELECT id, group_id, rank 
FROM (
    SELECT id, group_id, 
    @rank:=IF([email protected]_id,@rank,@rank+1) AS rank, 
    @group_id:=group_id 
    FROM MyTable CROSS JOIN (SELECT @rank:=0) AS _init 
    ORDER BY id DESC 
) AS t 
ORDER BY rank ASC, id ASC; 

输出:

+----+----------+------+ 
| id | group_id | rank | 
+----+----------+------+ 
| 9 |  NULL | 1 | 
| 7 |  7 | 2 | 
| 8 |  7 | 2 | 
| 4 |  4 | 3 | 
| 5 |  4 | 3 | 
| 6 |  4 | 3 | 
| 3 |  NULL | 4 | 
| 2 |  NULL | 5 | 
| 1 |  NULL | 6 | 
+----+----------+------+ 

你可以从外部查询的选择列表中省略rank列,我只是为了说明我如何排列组。