MySQL - IN()中的ORDER BY值

时间:2009-06-06 00:07:45

标签: mysql sql-order-by where-clause

我希望通过输入IN()函数的顺序对以下查询中返回的项目进行排序。

INPUT:

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

输出:

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

有什么想法吗?

6 个答案:

答案 0 :(得分:203)

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

FIELD函数返回剩余字符串列表中第一个字符串的位置。

但是,如果有一个表示排序顺序的索引列,然后按此列排序,则性能要好得多。

答案 1 :(得分:26)

此处的另一个选择: 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';

根据你正在做的事情,我发现它有点古怪但是在玩了一下后总能让它起作用。

答案 2 :(得分:3)

尝试类似

的内容
... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...

答案 3 :(得分: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;

描述:我想显示帐户列表。在这里,我在sp中传递了一个客户ID。现在,它将列出帐户名称,其帐户链接到顶部,然后按字母顺序显示其他帐户。

答案 4 :(得分:2)

您的表中需要另一列(数字),您可以在其中指定排序顺序。 IN子句不能以这种方式工作。

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

答案 5 :(得分:0)

只需使用

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

避免像

这样的情况
 INSTR('1,2,3,11' ,`field`) 

将以无序结果行结束:1和11交替