首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL :按字段/组按

MySQL :按字段/组按
EN

Stack Overflow用户
提问于 2013-10-29 13:23:04
回答 1查看 627关注 0票数 5

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

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

换言之,我有:

代码语言:javascript
复制
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

我想:

代码语言:javascript
复制
id  lang text
1   en   text_EN
2   fr   text_FR2
3   fr   text_FR3

因此,我阅读了一些主题,如thisthisthatthat。好的。我试过这个:

代码语言:javascript
复制
SELECT text FROM (
    SELECT id, text 
    FROM translation 
    ORDER BY FIELD(lang, 'en', 'fr', 'es')
) tt GROUP BY tt.id;

但是,当我解释这个问题时,我可以读到:

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-29 13:38:28

我建议每种语言都由id在桌子上使用。您可以使用LEFT JOIN来允许空结果。查询仍然使用临时/文件,因为它必须扫描整个表(您可以使用WHERE来限制它更多),但只对第一个表。连接表上的查找应该是快速的。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19659453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档