0

请看一下这个查询:

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 秒。(性能问题)

该查询是否有任何优化?(以及它的子选择查询的替代方案)

4

1 回答 1

0

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

我不能轻易想到在 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)。

于 2013-01-31T01:22:27.347 回答