繁体   English   中英

如何优化此SQL查询?

[英]How to optimize this SQL query?

我有一个包含问题和答案的数据库,这些问题和答案被翻译成网站使用的所有语言。 但是,当一个问题尚未翻译时,我想用英语显示该问题。 因此,类似gettext的行为。

我当前对此的SQL查询如下所示:

SELECT * FROM questions_view WHERE `language` = "de" AND `#parent` IS NULL
UNION 
SELECT * FROM questions_view WHERE `language` = "en" AND `#parent` IS NULL 
    AND id NOT IN (SELECT id 
                   FROM questions_view 
                   WHERE `language` = "de")

但是我觉得这不是实现此目的的最佳方法。 有小费吗?

这个:

SELECT  qi.*
FROM    (
        SELECT  DISTINCT id
        FROM    questions_view
        ) qd
JOIN    questions_view qi
ON      qi.id = qd.id
        AND qi.language =
        COALESCE(
        (
        SELECT  language
        FROM    questions_view qn
        WHERE   parent IS NULL
                AND language = 'de'
                AND qn.id = qd.id
        ),
        (
        SELECT  language
        FROM    questions_view qn
        WHERE   parent IS NULL
                AND language = 'en'
                AND qn.id = qd.id
        )
        )

或这个:

SELECT  COALESCE(qde.question_text, qen.question_text)
FROM    (
        SELECT  DISTINCT id
        FROM    questions_view
        ) qd
LEFT JOIN
        questions_view qde
ON      qde.id = qd.id
        AND qde.language = 'de'
LEFT JOIN
        questions_view qen
ON      qen.id = qd.id
        AND qen.language = 'en'

如果这些查询更好,哪个取决于您的数据库系统以及数据库中翻译了多少个问题。

有关更多详细信息,请参阅我的博客中的系列文章:

我想不出任何其他解决方案。 如果尚未翻译问题,则可以将language设置为null ,这将允许您进行如下修改:

select * from questions_view where `language` = "de" and `#parent` is null
union 
select * from questions_view where `language` is null and `#parent` is null 

OTOH,这可能有助于先将翻译后的问题添加到临时表中,然后执行“德语中不存在”-检查为

and not exists (select 1 from temp_translated t where t.id = id)

不知道我是否正确,但这还不够

select * from questions_view where language in ('de','en') and #parent is null

可能通过删除存在项并仅获取第一个可用答案来删除一次前往数据库的旅程,例如

Select Top 1 *
FROM
(
    select 1 as myRank, * from questions_view where `language` = "de" and `#parent` is null
    union 
    select 2 as myRank, * from questions_view where `language` = "en" and `#parent` is null 
) A
Order By myRank asc

而且,我会寻求丹麦的答案 ,而不是通配符查询,仅返回所需的列名,而不是全部检索它们。

例如

Select col1, col2, col3, col_etc from questions_view where 
language in ('de','en') and #parent is null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM