0

私は何時間もテーブルルックアップのためにこのクエリに取り組んできましたが、ついに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 年間を通して、学生はコンピュータを繰り返し変更する可能性があり、コンピュータは別の学生に繰り返し変更する可能性があります。

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 に答える