2017-08-28 116 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列,我只是爲了說明我如何排列組。