【发布时间】:2014-01-08 11:20:59
【问题描述】:
我有 3 列:
- 大学(cname ,州,招生)
- 学生 (sid , sname , gpa , sizehs )
- 应用(sid、cname、major、decision)
我试过这个查询:
select j.major , max(j.gpa)
from (select s.* , a.cname , a.major, a.decision
from student s join apply a on s.sid = a.sid and decision = 'y') j
group by major
这行得通。但是当我再添加一个要选择的字段时,它会中断:
select major , sname , max(gpa) , (select avg(gpa) from j) as avg -- trouble
from (select s.* , a.cname , a.major, a.decision
from student s join apply a on s.sid = a.sid and decision = 'y') j
group by major
having max(gpa) < avg;
我收到一条错误消息:表 j 不存在。为什么会这样?
如果 j 不存在,那么在我说 j.gpa 等的第一个查询中,它可以工作。
我的目标是找到Majors whose applicant's maximum GPA is below the average,我做了一个有效的查询:
select major , sname , student.sid , gpa ,
(select round(avg(gpa),5) as avg from student join apply
on student.sid = apply.sid and decision='Y') as avg
from student join apply on student.sid = apply.sid and decision='Y'
group by major
having max(gpa) < avg
但在这里,我必须在 select 和 from 中输入连接部分。我希望有一些方法可以跳过两次输入连接部分,所以我想出了上面的(错误的)查询。
任何帮助都会很棒。
【问题讨论】:
-
首先,你不应该使用 avg 作为字段别名,它是一个函数。其次,给表起别名时应该使用 AS 关键字。添加括号也有帮助。
-
你试过别名吗?
-
当mysql解释你的查询时,尤其是这部分:
(select avg(gpa) from j)你的j别名不存在 -
但
j.gpa等似乎在 select 中工作?那为什么呢?