我希望通过输入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 |
有什么想法吗?
答案 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交替