mysql - 我可以将带有 JOIN 的 SQL 语句分解为更小的查询或优化查询吗?

标签 mysql sql query-optimization

我的查询破坏了我网站的某个区域。当试图加载以下 SQL 语句时,站点永远旋转!我对 sql 语句相当陌生,这个特定的语句是由另一位开发人员创建的。有没有办法优化以下语句?或者将它分解成更小的语句以便运行得更快?我不知所措!感谢您的帮助。

SELECT
    `wp_quiz_users`.`Id`,
    `wp_quiz_users`.`SessionId`,
    `wp_quiz_users`.`Score`,
    `wp_quiz_users`.`Date`,
    `wp_quiz_users`.`Referrer`,
    `wp_quiz_users`.`ContactData`,
    (SELECT
        SUM(`wp_quiz_users_answers`.`AnswerValue`) 
    FROM
        `wp_quiz_users_answers` 
    JOIN
        `wp_quiz_questions` 
            ON `wp_quiz_users_answers`.`QuestionId` = `wp_quiz_questions`.`id` 
    WHERE
        `wp_quiz_users_answers`.`UserId` = `wp_quiz_users`.`Id` 
        AND `wp_quiz_questions`.`Category` = 1) AS `SectionOne`,
    (SELECT
        SUM(`wp_quiz_users_answers`.`AnswerValue`) 
    FROM
        `wp_quiz_users_answers` 
    JOIN
        `wp_quiz_questions` 
            ON `wp_quiz_users_answers`.`QuestionId` = `wp_quiz_questions`.`id` 
    WHERE
        `wp_quiz_users_answers`.`UserId` = `wp_quiz_users`.`Id` 
        AND `wp_quiz_questions`.`Category` = 2) AS `SectionTwo`,
    (SELECT
        SUM(`wp_quiz_users_answers`.`AnswerValue`) 
    FROM
        `wp_quiz_users_answers` 
    JOIN
        `wp_quiz_questions` 
            ON `wp_quiz_users_answers`.`QuestionId` = `wp_quiz_questions`.`id` 
    WHERE
        `wp_quiz_users_answers`.`UserId` = `wp_quiz_users`.`Id` 
        AND `wp_quiz_questions`.`Category` = 3) AS `SectionThree`,
    (SELECT
        SUM(`wp_quiz_users_answers`.`AnswerValue`) 
    FROM
        `wp_quiz_users_answers` 
    JOIN
        `wp_quiz_questions` 
            ON `wp_quiz_users_answers`.`QuestionId` = `wp_quiz_questions`.`id` 
    WHERE
        `wp_quiz_users_answers`.`UserId` = `wp_quiz_users`.`Id` 
        AND `wp_quiz_questions`.`Category` = 4) AS `SectionFour`,
    (SELECT
        SUM(`wp_quiz_users_answers`.`AnswerValue`) 
    FROM
        `wp_quiz_users_answers` 
    JOIN
        `wp_quiz_questions` 
            ON `wp_quiz_users_answers`.`QuestionId` = `wp_quiz_questions`.`id` 
    WHERE
        `wp_quiz_users_answers`.`UserId` = `wp_quiz_users`.`Id` 
        AND `wp_quiz_questions`.`Category` = 5) AS `SectionFive` 
FROM
    `wp_quiz_users`

最佳答案

这个答案类似于 Gordon 的答案,只是它在单独的子查询中对总和执行聚合。这使外部查询无需聚合,因此从 wp_quiz_users 表中选择我们想要的任何列应该没有问题。

SELECT
    t1.Id,
    t1.SessionId,
    t1.Score,
    t1.Date,
    t1.Referrer,
    t1.ContactData,
    COALESCE(t2.SectionOne, 0)   AS SectionOne,
    COALESCE(t2.SectionTwo, 0)   AS SectionTwo,
    COALESCE(t2.SectionThree, 0) AS SectionThree,
    COALESCE(t2.SectionFour, 0)  AS SectionFour,
    COALESCE(t2.SectionFive 0)   AS SectionFive
FROM wp_quiz_users t1
LEFT JOIN
(
    SELECT
        t1.UserId,
        SUM(CASE WHEN t2.Category = 1 THEN t1.AnswerValue ELSE 0 END) AS SectionOne,
        SUM(CASE WHEN t2.Category = 2 THEN t1.AnswerValue ELSE 0 END) AS SectionTwo,
        SUM(CASE WHEN t2.Category = 3 THEN t1.AnswerValue ELSE 0 END) AS SectionThree,
        SUM(CASE WHEN t2.Category = 4 THEN t1.AnswerValue ELSE 0 END) AS SectionFour,
        SUM(CASE WHEN t2.Category = 5 THEN t1.AnswerValue ELSE 0 END) AS SectionFive
    FROM wp_quiz_users_answers t1
    INNER JOIN wp_quiz_questions t2
        ON t1.QuestionId = t2.id 
    GROUP BY t1.UserId
) t2
    ON t1.Id = t2.UserId;

关于mysql - 我可以将带有 JOIN 的 SQL 语句分解为更小的查询或优化查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47706663/

相关文章:

mysql - 最佳实践 : mysql remote mobile devices sync over 3G connection

mysql - MySql JSON 数据类型的用例

sql - 使用 WHERE、AND 和 ILIKE 查询

sql - 重叠日期范围(SQL Server 2008)按天分组的最有效方法是什么?

mysql - java.sql.SQLException : target: commerce. 0.primary:vttablet:rpc 错误:代码 = InvalidArgument desc = 未知系统变量 'query_cache_size'

mysql - 更新行,列值表示为键

php - 使用 AJAX 从 SQL 数据库更新存储在 $_SESSION 数据中的用户配置文件

SQL Server - 具有 2 个组变量和 2 个聚合计算的动态透视

mysql - 为什么 MySQL 在此查询中显示 index_merge?

database - 为什么oracle建立了表索引却还要全表扫描?