【问题标题】:How to replace MySQL enum values for sorting如何替换 MySQL 枚举值进行排序
【发布时间】:2015-09-17 20:17:08
【问题描述】:

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

  • 草稿
  • 无效
  • 已发布

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

例如:

SELECT state FROM records ORDER BY state ASC

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

  1. 草稿 » 草稿 / Entwurf / Ébauche
  2. inactive » Inactive / 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

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

【问题讨论】:

  • 创建一个单独的表格,其中包含每种语言的状态术语。仅在主表中存储 stateIDlanguageID。加入他们并ORDER BY 新表中的相应字段。

标签: mysql sorting enums translation


【解决方案1】:

你可以使用ORDER BY FIELD(state, opt1, opt2, opt3....)

https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

因为它只是一个 CSV 列表,您应该能够使用该应用程序传递您想要的订单。

【讨论】:

    【解决方案2】:

    您可以得到的最快的解决方案可能是按照以下方式创建一个转换表:

    TABLE myEnum
        lang VARCHAR(2)
        keyValue VARCHAR(32)
        localeValue VARCHAR(32)
    

    然后用你的枚举翻译填充表,并在你的 SQL 查询中使用这个表:

    SELECT r.state FROM records r, myEnum e WHERE e.lang = 'de' and e.keyValue = r.state ORDER BY e.localeValue ASC

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多