MySQL – IN()中的ORDER BY值
嗨 – 我希望按照它们在IN()函数中input的顺序对以下查询中返回的项目进行sorting。
INPUT:
SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');
OUTPUT:
| 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')
FIELD函数返回剩余的string列表中第一个string的位置。
但是,具有表示sorting顺序的索引列,然后按此列进行sorting,性能方面会更好。
从这里的另一个选项: 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;
所以在你的情况下(未经testing)将是
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在SP。 现在,它将列出帐户链接的客户名称显示在顶部,其次是按字母顺序排列的其他帐户。
在表中需要另一列(数字),在其中指定sorting顺序。 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交替