0

我一直在研究这个查询以进行表查找几个小时,我终于打电话给 SO 寻求帮助。

共有三个表:

  • 计算机(用于 ID 的资产标签,有关计算机的其他信息)
  • 学生(学生ID,其他学生信息)
  • 作业(studentID、assetTag、issueDate)

这些显然是使用连接表之类的作业以多对多的方式链接的:
学生 <-> 作业 <-> 计算机

我整理了一个查询以显示学生姓名列表,以及他们最后一次完成的计算机作业。该查询效果很好,除了一个我无法解决的问题。如果学生 A 被分配了计算机 10000,然后将其上交,然后该计算机被分配给学生 B,直到他们上交它的那年年底,查找该资产显示两个学生都是该机器的合法所有者。我需要它只显示最新的学生。

当前查询:

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 的最后一次分配来汇总资产标签。

任何帮助将不胜感激,因为我需要快速完成这项工作。

编辑: 如果我解释说有许多学生对许多计算机和许多计算机对许多学生可能会有所帮助。

在一年中,一个学生可能会反复更换计算机,而一台计算机可能会反复更换给不同的学生。

4

1 回答 1

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 
于 2013-07-25T15:49:22.087 回答