2011-06-14 21 views
2

的mysql如何通過用戶定義的順序排序/排序mysql如何通過用戶定義的順序/上一個字段進行排序的項目數

說一個表

---------+---------- 
name  | category 
---------+---------- 
apple | 0 
orange | 0 
book  | 1 
notebook | 1 
textboo | 1 
phone | 2 

如何訂購它類別即類別= 1,類別= 0,類別的順序如下= 2 得到視圖

---------+---------- 
name  | category 
---------+---------- 
book  | 1 
notebook | 1 
textbook | 1 
apple | 0 
orange | 0 
phone | 2 

我們如何寫這一個SQL?

此外,如果語句可以根據每個類別上的項目數來識別和排序desc,那麼更好一些。

回答

7

你想這樣做:

SELECT Name, Category 
FROM MyTable 
ORDER BY 
    Case category 
     when 1 then 1 
     when 0 then 2 
     else 3 
    end, 
    Name 

更新

在第一個答案,訂單按類別確定。當在類別中的項目的數量排序,要做到這一點:

select name, Category, 
     (select count(*) from MyTable mt2 where mt2.Category = mt1.category) CatCount 
from MyTable mt1 
order by 3 DESC, name 
+0

+1;乾淨和有效的這個目的 – 2011-06-14 14:50:58

+0

你可以將子查詢作爲一個表,所以它只會運行一次,而不是表中的每一行(見我的答案)。 – 2011-06-14 16:54:28

0

如果你知道訂單而寫,你可以使用UNION ALL查詢:

SELECT name, category 
FROM table 
WHERE category = 1 

UNION ALL 

SELECT name, category 
FROM table 
WHERE category = 0 

UNION ALL 

SELECT name, category 
FROM table 
WHERE category = 2 
+1

'UNION'不保證訂單 – 2011-06-14 14:48:57

+0

你是對的阿德里安。我的一個錯誤。 – 2011-06-14 14:57:54

3

如果你想在類條目的數量進行排序,你可以這樣做:

SELECT my_table.name, my_table.category, cats.total FROM 
    (SELECT category, COUNT(*) AS total FROM my_table GROUP BY category) cats 
    INNER JOIN my_table ON my_table.category = cats.category 
    ORDER BY cats.total DESC, my_table.name ASC 
+0

+1,因爲這會隨着每個類別中條目數量的變化而自動更正 – GregA100k 2011-06-14 15:13:19

相關問題