选择上次已知的作业但仅适用于最新的作业

时间:2013-07-25 15:25:24

标签: mysql

我一直在为这个查询工作几个小时的表查找,我终于打电话求助了。

有三个表格:

  • computer(assetTag for ID,其他有关计算机的信息)
  • 学生(ID的学生ID,其他学生信息)
  • 作业(studentID,assetTag,issueDate)

这些显然是使用分配表之间的多对多链接:
学生< - >作业< - >计算机

我整理了一个查询,以显示学生姓名列表以及他们最后的计算机分配。查询效果很好,除了一个我无法解决的问题。如果studentA被分配了计算机10000然后将其打开,然后该计算机被分配给studentB,直到年底他们将其打开,查找该资产显示两个学生都是该计算机的合法所有者。我需要它才能显示最新的学生。

当前查询:

SELECT SQL_CALC_FOUND_ROWS s.studentID, s.lName, s.fName, s.uName, s.grade, c.assetTag, c.location, c.`status`  FROM student s 
INNER JOIN
(
        SELECT studentID, MAX(issueDate) MaxDate
        FROM assignment GROUP BY studentID
)   MaxDates ON s.studentID = MaxDates.studentID AND s.active = 1 
INNER JOIN assignment a ON MaxDates.studentID = a.studentID AND MaxDates.MaxDate = a.issueDate AND a.loaner = 0
INNER JOIN computer c ON a.assetTag = c.assetTag

大部分以前的机器所有者都处于非活动状态(s.active = 0),因此重复数据不多,但不应该有任何重复的资产标签。

我希望我可以根据最后一次分配EVER汇总assetTags。

任何帮助都会非常感激,因为我需要很快完成这项工作。

修改 如果我向很多学生解释许多学生和许多计算机都有很多学生可能会有所帮助。

全年学生可能反复更换计算机,计算机可能会反复更换为不同的学生。

1 个答案:

答案 0 :(得分:1)

您的子查询可能如下所示:

SELECT studentID, issueDate MaxDate
FROM assignment
GROUP BY studentID
HAVING issueDate = max(issueDate)

这将返回每个学生最近作业的学生ID列表。

作为替代方案,您可以使用以下命令替换查询的整个混乱:

select SQL_CALC_FOUND_ROWS s.studentID, s.lName, s.fName, s.uName, s.grade, c.assetTag, c.location, c.`status`, a.issueDate
  from assignment a
 inner join student s on a.studentID = s.studentID
 inner join computer c on a.assetTag = c.assetTag
 group by a.assetTag
having a.issueDate = max(a.issueDate)

由于having不起作用而更新:

select SQL_CALC_FOUND_ROWS s.studentID, s.lName, s.fName, s.uName, s.grade, c.assetTag, c.location, c.`status`, a.issueDate 
from assignment a 
inner join student s on a.studentID = s.studentID 
inner join computer c on a.assetTag = c.assetTag 
where a.issueDate = (select max(issueDate) from assignment where assetTag=a.assetTag)
group by a.assetTag