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/…)- 在此上下文是控制流功能。