如何在mySQL中定义一个自定义的ORDER BY命令
在MySQL中,我如何定义一个自定义的sorting顺序。
试图解释我想要考虑这个表格:
ID Language Text 0 ENU a 0 JPN b 0 DAN c 1 ENU d 1 JPN e 1 DAN f 2 etc... 这里我想返回按语言和升序IDsorting的所有行,这样Language = ENU先是JPN,最后是DAN。
结果应该是:a,d,b,e,c,f等
这甚至有可能吗?
  MySQL有一个方便的函数叫做FIELD() ,对于这样的任务是非常好的。 
 ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID 
但请注意
- 
这使得你的SQL可移植性降低,因为其他DBMS可能没有这样的function 
- 
当您的语言列表(或其他sorting值)变得更长时,最好为他们提供一个sortorder列的单独表格,并将其join到您的查询中进行sorting。 
 如果这些是唯一的三个值,那么你可以使用CASEexpression式 : 
 ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 END 
  (如果可能有其他值,那么您可能需要添加一些额外的逻辑来保持顺序一致;例如,您可以将ELSE 4添加到该CASEexpression式,然后按Language本身的顺序作为第三个sorting条件: 
 ORDER BY `ID`, CASE `Language` WHEN 'ENU' THEN 1 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 3 ELSE 4 END, `Language` 
)
你有一些非正式的select,首先是改变语言为ENUM(假设这是可能的,你只能期望一些变化)
 如果您将其指定为ENUM('ENU','JPN','DAN')那么ORDER Language ASC将按您指定的顺序排列。 
第二个将涉及一个案件,即
 SELECT * FROM table ORDER BY CASE Language WHEN 'ENU' THEN 3 WHEN 'JPN' THEN 2 WHEN 'DAN' THEN 1 ELSE 0 END DESC, ID ASC 
性能方面,ENUM方法将返回更快的结果,但如果您需要添加更多的语言,则会更麻烦。 第三个选项是为语言添加一个规范化表,但是在这种情况下可能是过度的。