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

Chr*_*sty 2 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`
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 5

这个答案与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;
Run Code Online (Sandbox Code Playgroud)