【问题标题】:MySQL : ORDER BY FIELD / GROUP BYMySQL:按字段/分组排序
【发布时间】:2013-11-08 16:20:18
【问题描述】:

我的问题是关于 MySQL 优化和良好实践的。

我必须获得带有顺序偏好的翻译文本列表:如果我找不到英文文本,我想使用法语文本,如果它不存在,我想使用西班牙语。

换句话说,我有:

id  lang text
1   fr   text_FR
1   en   text_EN
1   es   text_ES
2   fr   text_FR2
3   fr   text_FR3
3   es   text_ES3

我想要:

id  lang text
1   en   text_EN
2   fr   text_FR2
3   fr   text_FR3

所以我阅读了一些主题,例如 thisthisthatthat。好的。 我试过这个:

SELECT text FROM (
    SELECT id, text 
    FROM translation 
    ORDER BY FIELD(lang, 'en', 'fr', 'es')
) tt GROUP BY tt.id;

但是,当我解释这个查询时,我可以阅读:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  NULL    ALL NULL    NULL    NULL    NULL    4   Using temporary; Using filesort
2   DERIVED translation NULL    ALL PRIMARY PRIMARY 52      1641        Using filesort

所以它没有优化,因为子查询。我可以避免这个子查询吗?

【问题讨论】:

    标签: mysql optimization


    【解决方案1】:

    对于每种语言,我建议JOIN在一张桌子上id。您可以使用LEFT JOIN 来允许空结果。该查询仍将使用temporary/filesort,因为它必须扫描整个表(您可以使用WHERE 对其进行更多限制),但仅限于第一个表。对连接表的查找应该很快。

    SELECT
      COALESCE(en.text, fr.text, es.text, any.text)
    FROM
      f any
      LEFT JOIN f en ON (any.id = en.id AND en.lang = 'en')
      LEFT JOIN f fr ON (any.id = fr.id AND fr.lang = 'fr')
      LEFT JOIN f es ON (any.id = es.id AND es.lang = 'es')
    GROUP BY any.id;
    

    http://sqlfiddle.com/#!2/baafc/1

    【讨论】:

    • 有趣,不知道COALESCE
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多