2009-06-06 73 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交替