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交替