我一直在为这个查询进行表查询长达数小时之久,最后我终于呼吁寻求帮助。

有三个表:


计算机(ID的assetTag,有关计算机的其他信息)
学生(学生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),因此没有太多重复项,但不应有任何重复的assetTag。

我希望我可以根据上一次分配的时间来汇总assetTags。

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

编辑:
如果我解释说有很多学生可以使用许多计算机,而很多计算机可以提供给许多学生,则可能会有所帮助。

全年中,学生可能会反复更换计算机,而计算机可能会反复更换其他学生。

最佳答案

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

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

关于mysql - 选择最后一次已知的任务,但仅适用于最新的人员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17862261/

10-10 22:03