MySQL : ORDER BY FIELD / GROUP BY

5

我的问题是关于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

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

1个回答

2

我建议针对每种语言,通过id在表格上进行JOIN。您可以使用LEFT JOIN来允许空结果。查询仍将使用临时/文件排序,因为它必须扫描整个表格(您可以使用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 - xiankai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接