我的问题是关于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因此,我阅读了一些主题,如this、this、that或that。好的。我试过这个:
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所以它没有被优化,因为有子查询。我能避免这个子查询吗?
发布于 2013-10-29 13:38:28
我建议每种语言都由id在桌子上使用。您可以使用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
https://stackoverflow.com/questions/19659453
复制相似问题