我有一个带有枚举字段的mysql表,用于存储元素的状态,例如:
这些状态被转换为应用程序中用户的语言环境,并且由于翻译可能差异很大,因此无法在Mysql查询中按状态对记录进行排序,因为枚举值的顺序与命令的顺序不匹配翻译的字符串。
例如:
SELECT state FROM records ORDER BY state ASC
将为英语,德语和法语提供以下结果:
由于Mysql按枚举值排序,在应用程序中使用此顺序使得按状态排序似乎是混乱的。
当然可以使用翻译的字符串在应用程序中按状态进行排序,但它会删除一层复杂性,以便能够直接在查询中执行此操作 - 以及提高应用程序性能。 / p>
我发现的一个解决方案是在查询中使用CASE语句:
SELECT
CASE state
WHEN 'draft' THEN 'Entwurf'
WHEN 'inactive' THEN 'Inaktiv'
WHEN 'published' THEN 'Freigeschaltet'
END
FROM
records
ORDER BY
state ASC
是否有更好/更快的方式通过应用程序中翻译的自定义字符串对枚举进行排序?
答案 0 :(得分:1)
您可以使用ORDER BY FIELD(state, opt1, opt2, opt3....)
https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
因为它只是一个CSV列表,您应该能够使用该应用程序传递您想要的订单。
答案 1 :(得分:0)
您可以获得的最快解决方案可能是创建一个转换表:
TABLE myEnum
lang VARCHAR(2)
keyValue VARCHAR(32)
localeValue VARCHAR(32)
然后在表中填入enum的翻译,并在SQL查询的连接中使用此表:
SELECT r.state FROM records r, myEnum e WHERE e.lang = 'de' and e.keyValue = r.state ORDER BY e.localeValue ASC
当然,您可能不想使用这些表名或列名。