【问题标题】:Is there a way to avoid writing inline views more than once in MySQL有没有办法避免在 MySQL 中多次编写内联视图
【发布时间】:2013-09-21 02:45:50
【问题描述】:

考虑一个学生表和一个成绩表。成绩表包含学生学习的所有课程的成绩。我想找到平均成绩最高的学生。

我会使用 CTE 来解决这个问题,但似乎 MySQL 不提供 CTE。 我想写一个查询来找到最大平均数的学生。等级,也避免编写查询,得到平均。所有学生的成绩,不止一次。

一个不起作用的查询如下(这可能会让我更清楚我想要实现的目标):

select temp.st_name 
from (select st1.student_name st_name, AVG(grade) avg_grade from Student st1, Grades grd1 where st1.student_id = grd1 .student_id group by st1.student_id,  st1.sudent_name) temp 
where temp.avg_grade = (select MAX(temp.avg_grade) from temp)

上面的查询给出了错误:临时表不存在。

有没有其他方法可以找到最大平均数的学生。等级,避免写两次inline-view语句?

谢谢!

【问题讨论】:

    标签: mysql inline-view


    【解决方案1】:

    我相信您可以将 ORDER BY 与 LIMIT 一起使用,但我从未编写过任何 MYSQL,所以我可能是错的 ;)

    SELECT
        st1.student_name st_name,
        AVG(grade) avg_grade
    FROM Student st1, Grades grd1
    WHERE st1.student_id = grd1 .student_id
    GROUP BY 
        st1.student_id,
        st1.sudent_name
    ORDER BY avg_grade DESC
    LIMIT 1;
    

    注意:我没有更改您的初始语句,但您应该使用 JOIN 语法而不是 FROM tbl1, tbl2

    【讨论】:

    • 实际上这可能会起作用。没有仔细阅读问题,只关注“你可以在 MySQL 中进行 CTE”部分。很好的解决方案。
    • 感谢您的回复,但如果平均成绩最高的学生不止一个,我认为这将不起作用。
    • @NitinYadav,那么在这种情况下,您别无选择,只能执行查询查询。
    【解决方案2】:

    不,你不能。您的选择是将那个坏男孩复制/粘贴到另一个子查询中,或者创建一个实际视图来查询。

    【讨论】:

    • 我希望我不必听到这个 :( 感谢您的回复!!
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2019-05-29
    • 2011-09-13
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多