gpt4 book ai didi

MySQL : ORDER BY FIELD/GROUP BY

转载 作者:可可西里 更新时间:2023-11-01 07:08:14 24 4
gpt4 key购买 nike

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

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

最佳答案

我建议通过id 为每种语言在表上JOINing。您可以使用 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

关于MySQL : ORDER BY FIELD/GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19659453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com