如何替换Mysql枚举值以进行排序

时间:2015-09-17 20:17:09

标签: mysql sorting enums translation

我有一个带有枚举字段的mysql表,用于存储元素的状态,例如:

  • 草案
  • 非活性
  • 公布

这些状态被转换为应用程序中用户的语言环境,并且由于翻译可能差异很大,因此无法在Mysql查询中按状态对记录进行排序,因为枚举值的顺序与命令的顺序不匹配翻译的字符串。

例如:

SELECT state FROM records ORDER BY state ASC

将为英语,德语和法语提供以下结果:

  1. 草稿»草稿/ Entwurf /Ébauche
  2. 无效»非活动/ Inaktiv / Inactif
  3. 出版»已发布/ Freigeschaltet /Publié
  4. 由于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
    

    是否有更好/更快的方式通过应用程序中翻译的自定义字符串对枚举进行排序?

2 个答案:

答案 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

当然,您可能不想使用这些表名或列名。