【问题标题】:Assign alias to a table in subquery MySQL为子查询 MySQL 中的表分配别名
【发布时间】:2013-06-20 12:00:05
【问题描述】:

我有两张桌子:

  1. exam 表,其中包含学生的成绩
  2. 和学生表

两者都以这种方式加入:student.id=exam.student_id。

我正在尝试使用以下查询获得前五名得分最高的学生,这些学生通过 5 天的平均得分计算得出:

SELECT 
    student.id as std_id, 
    student.name, 
    (SELECT AVG(score) FROM exam WHERE exam.student_id=std_id ORDER BY exam.timestamp DESC LIMIT 5) AS score 

FROM student 
ORDER BY score 
DESC LIMIT 5

我遇到以下错误:

#1054 - Unknown column 'std_id' in 'where clause'

我也尝试过用 student.id 替换 std_id ,但仍然没有运气。

知道如何解决这个问题吗?非常感谢

------------------------------------------------------------------------------

抱歉,我的逻辑有误。 如前所述,平均值是针对

仅记录最后 5 个分数

。 更新查询:

SELECT 
    student.id as std_id, 
    student.name, 
    (SELECT AVG(score) FROM (SELECT score FROM exam WHERE exam.student_id=student.id ORDER BY exam.timestamp DESC LIMIT 5) AS score) AS score 
FROM student 
ORDER BY score 
DESC LIMIT 5

给出错误的地方是我设置exam.student_id=student.id的地方

谢谢。

【问题讨论】:

  • 你能发布你的表定义和一些示例数据吗?

标签: mysql join subquery


【解决方案1】:

只需将 std_id 替换为 student.id - 在子查询编译期间别名还不存在,因为在子查询被认为有效(并且其输出已知)之前无法编译外部查询。

【讨论】:

  • 谢谢,但我已经尝试过了,但收到错误消息 #1054 - Unknown column 'student.id' in 'where Clause'
  • 你们是对的,很抱歉我的逻辑有误。我刚刚更新了我的问题。谢谢
【解决方案2】:

您的代码看起来应该对我有用(至少在 Niels Keurentjes 建议的 mod 完成后)。

您可以使用生成的序列而不是相关的子选择。像这样的东西:-

SELECT 
    student.id, 
    student.name, 
    AVG(Sub3.score)
FROM student
LEFT OUTER JOIN (
    SELECT Sub1.student_id, Sub1.score, @aSeq := IF(@PrevStudent = student_id, @aSeq + 1, 0) AS Sequence, @PrevStudent := student_id
    FROM (SELECT * FROM exam ORDER BY student_id, timestamp DESC) Sub1
    CROSS JOIN (SELECT @PrevStudent := 0, @aSeq := 0) Sub2
) Sub3
ON student.id = Sub3.student_id
WHERE (Sub3.Sequence IS NULL OR Sub3.Sequence < 5)
GROUP BY student.id, student.name

【讨论】:

  • 你们是对的,很抱歉我的逻辑有误。我刚刚更新了我的问题。谢谢
猜你喜欢
  • 2019-03-09
  • 2012-06-06
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多