在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等.
这甚至可能吗?
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)
)
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方法将返回更快的结果,但如果您需要添加更多语言则会更麻烦.第三种选择是为语言添加一个规范化表,但在这种情况下可能有点过分.
| 归档时间: |
|
| 查看次数: |
78240 次 |
| 最近记录: |