繁体   English   中英

亚选择替代品

[英]subselect alternatives

看一下这个查询,请:

SELECT
    (SELECT COUNT(id) FROM result WHERE `mterm1` > r.mterm1 AND lesson_id = r.lesson_id) + 1 AS `pos_mt1_school`,
    (SELECT COUNT(id) FROM result WHERE `mterm1` > r.mterm1 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_mt1_class`,

    (SELECT COUNT(id) FROM result WHERE `term1` > r.term1 AND lesson_id = r.lesson_id) + 1 AS `pos_t1_school`,
    (SELECT COUNT(id) FROM result WHERE `term1` > r.term1 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_t1_class`,

    (SELECT COUNT(id) FROM result WHERE `mterm2` > r.mterm2 AND lesson_id = r.lesson_id) + 1 AS `pos_mt2_school`,
    (SELECT COUNT(id) FROM result WHERE `mterm2` > r.mterm2 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_mt2_class`,

    (SELECT COUNT(id) FROM result WHERE `term2` > r.term2 AND lesson_id = r.lesson_id) + 1 AS `pos_t2_school`,
    (SELECT COUNT(id) FROM result WHERE `term2` > r.term2 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_t2_class`,

    r.*, student.* FROM result r

LEFT JOIN lessons lesson ON r.lesson_id = lesson.id
LEFT JOIN students student ON r.student_id = student.id
LEFT JOIN classes class ON student.class_id = class.id

WHERE student.id = 217 ORDER BY lesson.id ASC

我想显示学生的考试成绩。 因此,首先从表result选择他的结果(考试分数),然后加入lessons以显示课程名称,最后计算出他所在班级和学校中每堂课的学生排名。 (根据他的考试成绩)

该查询工作正常,但是大约需要2秒钟才能执行。 (性能问题)

该查询是否有任何优化? (及其子查询的替代方法)

您正在子选择中进行累计计数。

我不能轻易想到在单个查询中在MySQL中执行此操作的另一种方法。 如果“>”中有“ =”,则可以将其转换为联接。 但这在这种情况下是不可能的。

您可以使用以下查询将其转换为带有聚合的显式交叉联接:

SELECT sum(case when r2.mterm1  > r.mterm1 then 1 else 0 end)+1 as `pos_mt1_school`,
       sum(case when r2.mterm1 > r.mterm1 and r2.class_id = r.class_id) + 1 then 1 else 0 end) AS `pos_mt1_class`,
       . . .
    r.*, student.*
FROM result r LEFT JOIN
     lessons lesson
     ON r.lesson_id = lesson.id LEFT JOIN
     students student
     ON r.student_id = student.id LEFT JOIN
     classes class
     ON student.class_id = class.id join
     result r2
     on r.lesson_id = r2.lesson_id
WHERE student.id = 217
group by r.result_id
ORDER BY lesson.id ASC

我不确定这会比原始版本快。 顺便说一下,原始版本将通过增加两个索引来加速:result(lesson_id,term2)和result(less_id,class_id,term2)。

暂无
暂无

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

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