MySQL:按字段/分组排序
Posted
技术标签:
【中文标题】MySQL:按字段/分组排序【英文标题】:MySQL : ORDER BY FIELD / GROUP BY 【发布时间】: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
所以我阅读了一些主题,例如 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
所以它没有优化,因为子查询。我可以避免这个子查询吗?
【问题讨论】:
【参考方案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
!以上是关于MySQL:按字段/分组排序的主要内容,如果未能解决你的问题,请参考以下文章