2012-12-31 58 views
48

我有3列的表格:排序方式特定字段值第一

id | name | priority 
-------------------- 
1 | core | 10 
2 | core | 9 
3 | other | 8 
4 | board | 7 
5 | board | 6 
6 | core | 4 

我要訂購使用priority結果集,但首先是那些具有即使有較低的優先級name=core行。結果應該是這樣的

id | name | priority 
-------------------- 
6 | core | 4 
2 | core | 9 
1 | core | 10 
5 | board | 6 
4 | board | 7 
3 | other | 8 

回答

57

還有MySQL FIELD function

如果你想爲所有可能的值的完整排序:

SELECT id, name, priority 
FROM mytable 
ORDER BY FIELD(priority, "core", "board", "other") 

如果你只關心「核心」是第一個和其他價值並不重要:

SELECT id, name, priority 
FROM mytable 
ORDER BY FIELD(priority, "core") DESC 

如果你想先按「核心」排序,其他字段按正常排序順序排序:

SELECT id, name, priority 
FROM mytable 
ORDER BY FIELD(priority, "core") DESC, priority 

有一些注意事項在這裏,雖然:

首先,我很確定這是隻有mysql的功能 - 問題是標記爲mysql,但你永遠不知道。

其次,要注意如何FIELD()作品:它返回基於一個指數值 - 在FIELD(priority, "core")的情況下,它會返回1,如果「核心」是值。如果該字段的值不在列表中,則返回。這就是爲什麼DESC是必要的,除非你指定所有可能的值。

+3

After大約5年後,我改變了接受的答案,因爲它更乾淨,更快。 – Omid

+0

db2相當於? – Cybermonk

3

一種方法是這樣的:

select id, name, priority from table a 
order by case when name='core' then -1 else priority end asc, priority asc 
+1

這不會失去'core'行的順序嗎? – mellamokb

+1

@mellamokb不,用我的編輯;) – Icarus

6

一個優先選擇特定行的方法是大量增加它們的優先級。你可以用CASE語句來做到這一點:

select id, name, priority 
    from mytable 
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc 

演示:http://www.sqlfiddle.com/#!2/753ee/1

79

一般來說,你可以做

select * from your_table 
order by case when name = 'core' then 1 else 2 end, 
     priority 

尤其是在MySQL中,你也可以做

select * from your_table 
order by name <> 'core', 
     priority 

由於MySQL中的比較結果是01,您可以按照該結果進行排序。

+5

+1比我的更清潔的解決方案:) – mellamokb

+1

'1'和'2'的含義是什麼? –

+1

我有大約3000行進行排序。在我的情況下,與此解決方案相比,@ Ayman-Hourieh在http://stackoverflow.com/questions/958627/mysql-order-by-values-within-in上的解決方案佔用了一半的時間。 – nightlyop

1

這對我的作品使用的是Postgres 9+:

SELECT * 
FROM your_table 
ORDER BY name = 'core' DESC, priority DESC 
+0

小心解釋-1? 錯誤+ Postgres版本? –

0

做到這一點:

SELECT * FROM table ORDER BY column `name`+0 ASC 

追加+ 0將意味着:

0, 10, 11, 2, 3, 4 

變爲:

0, 2, 3, 4, 10, 11 
2
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5') 
+3

雖然您的代碼可能是問題的答案,但最好提供一些解釋。 – Mehraban