私は何時間もテーブルルックアップのためにこのクエリに取り組んできましたが、ついにSOに助けを求めています。
次の 3 つのテーブルがあります。
- computer (IDのassetTag、その他のコンピュータに関する情報)
- 学生(学生証の学生ID、その他の学生情報)
- 割り当て (studentID、assetTag、issueDate)
これらは明らかに、ジャンクション テーブルのような割り当てを使用して、多対多としてリンクされています。
学生 <-> 割り当て <-> コンピュータ
生徒の名前のリストと、生徒が最後に受けたコンピューターの割り当てを表示するクエリをまとめました。クエリはうまく機能しますが、頭を悩ませることができない 1 つの問題があります。生徒 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) であるため、重複はあまりありませんが、assetTags が重複することはありません。
前回の割り当てに基づいてassetTagsを集約できたらいいのにと思います。
これをかなり早く終わらせる必要があるので、どんな助けでも大歓迎です。
編集: 多くのコンピュータに多くの学生がいて、多くの学生に多くのコンピュータがあることを説明すると役立つかもしれません。
1 年間を通して、学生はコンピュータを繰り返し変更する可能性があり、コンピュータは別の学生に繰り返し変更する可能性があります。