Answers:
MySQL有一个方便的函数FIELD()
,它非常适合执行此类任务。
ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID
但是请注意,
由于其他DBMS可能没有此功能,因此它使SQL的可移植性较差
当您的语言列表(或其他要排序的值)长得多时,最好有一个带有sortorder列的单独表,然后将其加入查询中进行排序。
GROUP BY
之前有过该怎么办?例如,我想要的第一个值出现在末尾?
GROUP BY
子查询中,并在外部查询中对其进行排序
如果这些是仅有的三个值,那么你可以使用一个CASE
表达式:
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
END
(如果可能还有其他值,那么您可能想要添加一些额外的逻辑以保持顺序一致;例如,您可以添加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`
)
您有两个选择,第一个是将Language更改为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方法将返回更快的结果,但是如果您需要添加更多的语言,则将更加麻烦。第三种选择是为语言添加一个规范化表,但是在这种情况下可能会显得过大。
ENUM('ENU','JPN','DAN')
?
END DESC,
应该END CASE DESC,
吗?
CASE
需求都END CASE
取决于上下文。 CASE
在PROCEDURE中,需要END CASE
(dev.mysql.com/doc/refman/5.5/en/case.html),但是CASE
在SELECT中不需要END CASE
,只需END
(dev.mysql.com/doc/refman/5.7/en/…)- 在此上下文是控制流功能。