如何在mySQL中定义自定义ORDER BY顺序

Mul*_*ner 125 mysql

在MySQL中如何定义自定义排序顺序.

为了解释我想要的东西,考虑一下这个表:

ID  Language    Text
0   ENU         a
0   JPN         b
0   DAN         c       
1   ENU         d
1   JPN         e
1   DAN         f
2   etc...
Run Code Online (Sandbox Code Playgroud)

在这里,我想返回按语言和升序ID排序的所有行,以便首先是Language = ENU,然后是JPN,最后是DAN.

结果应该是:a,d,b,e,c,f等.

这甚至可能吗?

Mch*_*chl 251

MySQL有一个方便的函数FIELD(),非常适合这样的任务.

ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID

但请注意

  1. 它使您的SQL不那么便携,因为其他DBMS可能没有这样的功能

  2. 当您的语言列表(或其他要排序的值)变得更长时,最好为它们创建一个带有sortorder列的单独表,并将其连接到您的查询以进行排序.

  • 谢谢这完全适合我的情况,我只需要按两个值(一种主要语言,例如JPN和一种后备语言,例如ENU)进行排序. (3认同)
  • 男人,你刚刚在magento中重写了我:) (3认同)

rua*_*akh 47

如果这些是仅有的三个值,那么你可以使用一个CASE表达式:

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         END
Run Code Online (Sandbox Code Playgroud)

(如果可能存在其他值,那么您可能需要添加一些额外的逻辑以保持顺序一致;例如,您可以添加ELSE 4到该CASE表达式,然后将Language其自身排序为第三个排序标准:

ORDER BY `ID`,
         CASE `Language`
         WHEN 'ENU' THEN 1
         WHEN 'JPN' THEN 2
         WHEN 'DAN' THEN 3
         ELSE 4
         END,
         `Language`
Run Code Online (Sandbox Code Playgroud)

)

  • 这将首先按 ID 排序,结果为 a,b,c,d,e,f (2认同)

Sim*_*tal 17

你手边有几个选项,第一个是将语言改为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
Run Code Online (Sandbox Code Playgroud)

在性能方面,ENUM方法将返回更快的结果,但如果您需要添加更多语言则会更麻烦.第三种选择是为语言添加一个规范化表,但在这种情况下可能有点过分.