试图使两个最大功能工作

时间:2015-02-17 20:40:31

标签: sql subquery max

您想让这两个最大功能正常工作,我的查询出错了哪里?它不会返回任何错误,但只有我的WHERE语句中的一个最大值有效。这是查询

SELECT g.studentid, g.blockcode, sb.subjectcode, sb.daystart,sb.block,sb.dayend,
       sb.stime, sb.sday, ii.firstname instructorname,  ii.lastname instructorlastname, 
       sb.roomcode, r.building, d.description, rr.studentid,rr.sem, rr.sy
FROM grades g 
JOIN subjectblocking sb ON g.blockcode=sb.blockcode
JOIN instructorinfo ii ON sb.instructorid=ii.instructorid
JOIN subjects d ON sb.subjectcode = d.subjectcode
JOIN room r ON sb.roomcode=r.roomcode
JOIN register rr ON rr.studentid=g.studentid
WHERE g.studentid='$studentid'
AND rr.sem = (SELECT max(sem) 
              FROM register
              WHERE sy = (SELECT max(sy) from register))
ORDER BY  sb.daystart ASC, sb.stime like '%AM%' DESC;

1 个答案:

答案 0 :(得分:0)

执行

SELECT max(sy) from register

本身。你得到了什么?这是你期望的价值吗?然后执行

SELECT max(sem) 
FROM register
WHERE sy = (SELECT max(sy) from register)

本身。你得到了什么?这是你期望的价值吗?如果它不是您所期望的,请尝试对第一个查询中的值进行硬编码:

SELECT max(sem) 
FROM register
WHERE sy = 2015

如果现在值正确,则嵌套两个查询时出现问题。您没有指定您正在使用的DBMS,但这不是我期望在任何商业或甚至流行的开源系统中看到的问题。

如果您的查询中经常使用此双Max-of-a-Max结构,则可能需要创建一个名为oh sysem的计算列,其定义为sy * 10 + sem。这假设sem是1-4范围内的一个非常小的值。结果如下:

sy    sem  sysem
====  ===  ======
2014    1   20141
2014    2   20142
2014    3   20143
2014    4   20144
2015    1   20151

然后你可以将查询的那一部分改为

AND rr.sysem = (SELECT max(sysem) 
                FROM register)

如果sysem也被索引,那将是非常好的。