我希望作为排序依据的项目在下面的查询返回的他们进入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     |

任何想法?

有帮助吗?

解决方案

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

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

然而,更好的性能,明智的,有代表您的排序顺序的索引列,然后排序此列。

其他提示

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

根据你在做什么,我发现这是一个有点古怪,但总是有它与它打了一下后,开始工作。

尝试类似

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

可能是这可以帮助某人(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藻。现在,它会列出在顶部,然后按字母顺序排列的其他账户,只显示链接到客户帐户的帐户名称。

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

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

仅仅使用

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

避免像的情况

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top