2009-06-06 72 views
76

我希望通過將它們輸入到IN()函數中的順序對以下查詢中返回的項目進行排序。MySQL - IN中的ORDER BY值()

輸入:

SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C'); 

OUTPUT:

| id | name | 
^--------^---------^ 
| 5 | B  | 
| 6 | B  | 
| 1 | D  | 
| 15 | E  | 
| 17 | E  | 
| 9 | C  | 
| 18 | C  | 

任何想法?

回答

174
SELECT id, name 
FROM mytable 
WHERE name IN ('B', 'A', 'D', 'E', 'C') 
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C') 

FIELD函數返回字符串的剩餘列表中的第一個字符串的位置。

但是,具有代表排序順序的索引列,然後按此列進行排序的性能會更好。

+0

呃,這很酷!我懷疑它是MySQL特有的? – 2009-06-06 01:08:15

+9

@Vladimir - 是的,它是MySQL特有的。問題有mysql標籤。 – 2009-06-06 01:10:02

2

您需要在表格中另一列(數字),在其中指定排序順序。 IN子句不以這種方式工作。

B - 1 
A - 2 
D - 3 
E - 4 
C - 5 
+1

所需的順序可以是每查詢。 – 2009-06-06 00:15:27

4

試着這麼做

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ... 
25

從另一個選擇: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC; 

所以你的情況(未經測試)將

SELECT id, name 
FROM mytable 
WHERE name IN ('B', 'A', 'D', 'E', 'C') 
ORDER BY name = 'B', name = 'A', name = 'D', name = 'E', name = 'C'; 

取決於你在做什麼,我發現這是一個有點古怪,但總是在玩了一下之後纔開始工作。

3

可能這可以幫助別人(p_CustomerId在SP通過):

SELECT CompanyAccountId, CompanyName 
FROM account 
LEFT JOIN customer where CompanyAccountId = customer.AccountId 
GROUP BY CompanyAccountId 
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
              FROM customer 
              WHERE customerid= p_CustomerId) 
       THEN 0 
       ELSE 1 
      END, CompanyName; 

說明:我想要顯示的帳戶列表。在這裏,我傳遞一個客戶ID在SP。現在,它將列出帳戶名稱,其中鏈接到該客戶的帳戶顯示在頂部,然後按字母順序顯示其他帳戶。

0

只使用

order by INSTR(',B,C,D,A,' , concat(',' , `field`, ',')) 

避免像

INSTR('1,2,3,11' ,`field`) 

的情況將與無序的結果行結束:1個11交替