0

SQL ステートメントは次のとおりです。

SELECT DISTINCT  `class`, `student_id` , `student_name`,
( 
    SELECT SUM(  `credits` ) 
    FROM  `stumgr_scores` B
    JOIN  `stumgr_courses` USING (  `course_id` ) 
    WHERE  `year` =2012 AND A.`student_id` = B.`student_id`
) AS  `total_credits`,
( 
    SELECT SUM( `credits` *  `final_score` )
    FROM  `stumgr_scores` C
    JOIN  `stumgr_courses` USING (  `course_id` ) 
    WHERE  `year` =2012 AND A.`student_id` = C.`student_id`
) AS `total_scores`
FROM  `stumgr_scores` A
NATURAL JOIN  `stumgr_students` 
WHERE  `year` =2012 AND  `grade` =2011

集計関数を使用するこれら 2 つの select ステートメントが似ていることに気付くかもしれません。したがって、次のようにそれらを1つにマージしたいと思います。

SELECT DISTINCT  `class`, `student_id` , `student_name`,
( 
    SELECT 
        SUM(  `credits` ) AS  `total_credits`, 
        SUM( `credits` *  `final_score` ) AS  `total_scores`
    FROM  `stumgr_scores` B
    JOIN  `stumgr_courses` USING (  `course_id` ) 
    WHERE  `year` =2012 AND A.`student_id` = B.`student_id`
) AS `something`
FROM  `stumgr_scores` A
NATURAL JOIN  `stumgr_students` 
WHERE  `year` =2012 AND  `grade` =2011

もちろん、上記の SQL ステートメントは機能せず、どうすればよいかわかりません。また、データが大きいため、クエリが非常に遅くなります。何か提案はありますか? どうもありがとう。

4

1 に答える 1

2

JOINテーブル構造を少し推測する必要がありましたが、相関サブクエリではなく sを使用することで、このクエリを大幅に簡素化できるはずです。

SELECT  st.student_id,
        st.student_name,
        c.class,
        SUM(sc.credits) AS total_credits,
        SUM(sc.credits * sc.final_score) AS total_scores
FROM    stumgr_students st
        INNER JOIN stumgr_scores sc
            ON sc.student_id = st.student_id
        INNER JOIN stumgr_courses c
            ON c.course_id = st.course_id
GROUP BY st.student_id, st.student_name, c.class;
于 2013-04-25T11:58:08.457 に答える