如何替换 MySQL 枚举值进行排序
How to replace MySQL enum values for sorting
我有一个 mysql table 和一个存储元素状态的枚举字段,例如:
- 草稿
- 无效
- 发表
这些状态在应用程序中被翻译成用户的区域设置,并且由于翻译可能有很大差异,因此无法在 Mysql 查询中按状态对记录进行排序,因为枚举值的顺序将与翻译字符串的顺序不匹配。
例如:
SELECT state FROM records ORDER BY state ASC
将针对英语、德语和法语给出以下结果:
- 草稿 » Draft / Entwurf / Ébauche
- 不活跃 » 不活跃 / Inaktiv / Inactif
- 已发布 » 已发布/Freigeschaltet/Publié
由于 Mysql 按枚举值排序,在应用程序中使用此顺序会使按状态排序看起来很混乱。
当然,之后可以在应用程序中使用翻译后的字符串按状态进行排序,但是直接在查询中执行此操作会消除一层复杂性 - 并提高应用程序性能.
我找到的一个解决方案是在查询中使用 CASE 语句:
SELECT
CASE state
WHEN 'draft' THEN 'Entwurf'
WHEN 'inactive' THEN 'Inaktiv'
WHEN 'published' THEN 'Freigeschaltet'
END
FROM
records
ORDER BY
state ASC
是否有 better/faster 种方法可以根据在应用程序中翻译的自定义字符串对枚举进行排序?
你可以使用ORDER BY FIELD(state, opt1, opt2, opt3....)
https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
因为它只是一个 CSV 列表,您应该能够使用该应用程序传递您想要的订单。
您可以获得的最快解决方案可能是按照以下行创建翻译table:
TABLE myEnum
lang VARCHAR(2)
keyValue VARCHAR(32)
localeValue VARCHAR(32)
然后用您对枚举的翻译填充 table,并在您的 SQL 查询中使用此 table:
SELECT r.state FROM records r, myEnum e WHERE e.lang = 'de' and e.keyValue = r.state ORDER BY e.localeValue ASC
当然,您可能不想使用那些 table 或列名。
我有一个 mysql table 和一个存储元素状态的枚举字段,例如:
- 草稿
- 无效
- 发表
这些状态在应用程序中被翻译成用户的区域设置,并且由于翻译可能有很大差异,因此无法在 Mysql 查询中按状态对记录进行排序,因为枚举值的顺序将与翻译字符串的顺序不匹配。
例如:
SELECT state FROM records ORDER BY state ASC
将针对英语、德语和法语给出以下结果:
- 草稿 » Draft / Entwurf / Ébauche
- 不活跃 » 不活跃 / Inaktiv / Inactif
- 已发布 » 已发布/Freigeschaltet/Publié
由于 Mysql 按枚举值排序,在应用程序中使用此顺序会使按状态排序看起来很混乱。
当然,之后可以在应用程序中使用翻译后的字符串按状态进行排序,但是直接在查询中执行此操作会消除一层复杂性 - 并提高应用程序性能.
我找到的一个解决方案是在查询中使用 CASE 语句:
SELECT
CASE state
WHEN 'draft' THEN 'Entwurf'
WHEN 'inactive' THEN 'Inaktiv'
WHEN 'published' THEN 'Freigeschaltet'
END
FROM
records
ORDER BY
state ASC
是否有 better/faster 种方法可以根据在应用程序中翻译的自定义字符串对枚举进行排序?
你可以使用ORDER BY FIELD(state, opt1, opt2, opt3....)
https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
因为它只是一个 CSV 列表,您应该能够使用该应用程序传递您想要的订单。
您可以获得的最快解决方案可能是按照以下行创建翻译table:
TABLE myEnum
lang VARCHAR(2)
keyValue VARCHAR(32)
localeValue VARCHAR(32)
然后用您对枚举的翻译填充 table,并在您的 SQL 查询中使用此 table:
SELECT r.state FROM records r, myEnum e WHERE e.lang = 'de' and e.keyValue = r.state ORDER BY e.localeValue ASC
当然,您可能不想使用那些 table 或列名。