MySQL的 - ORDER BY值内()
-
12-09-2019 - |
题
我希望作为排序依据的项目在下面的查询返回的他们进入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交替
不隶属于 StackOverflow