120

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

输入:

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     |

有任何想法吗?

4

6 回答 6

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

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

但是,拥有一个代表您的排序顺序的索引列,然后按此列排序,在性能方面要好得多。

于 2009-06-06T00:16:15.977 回答
30

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

取决于你在做什么,我发现它有点古怪,但在玩了一点之后总是让它工作。

于 2009-06-06T01:54:19.507 回答
4

尝试类似的东西

... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
于 2009-06-06T00:13:56.653 回答
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。现在它将列出与该客户关联的帐户的帐户名称显示在顶部,然后按字母顺序显示其他帐户。

于 2011-09-07T02:32:58.753 回答
2

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

B - 1
A - 2
D - 3
E - 4
C - 5
于 2009-06-06T00:11:19.387 回答
0

只需使用

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

避免这种情况

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

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

于 2017-11-14T13:30:31.353 回答