如何替换 MySQL 枚举值进行排序

How to replace MySQL enum values for sorting

我有一个 mysql table 和一个存储元素状态的枚举字段,例如:

这些状态在应用程序中被翻译成用户的区域设置,并且由于翻译可能有很大差异,因此无法在 Mysql 查询中按状态对记录进行排序,因为枚举值的顺序将与翻译字符串的顺序不匹配。

例如:

SELECT state FROM records ORDER BY state ASC

将针对英语、德语和法语给出以下结果:

  1. 草稿 » Draft / Entwurf / Ébauche
  2. 不活跃 » 不活跃 / Inaktiv / Inactif
  3. 已发布 » 已发布/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 或列名。