我有一段时间和sql有同样的问题,当我坐下来编写我经常使用的相同的“暴力”黑客时,我认为必须有一种更有效的方法来做我想做的事情
我有类似的表:
grades(gradeID, taskID, grade, username, date)
tasks(taskID, task...)
assignment(assignmentID, title...)
assignment_tasks(assignmentID, taskID)
assignment_students(assignmentID, username)
students(username, forename...)
最后5个表非常静态,设置一次并且大部分都是单独使用。
对于成绩表,每次为任务输入新成绩时都会创建一条新记录。
我想为作业生成一个摘要表,其中可能包括5个任务,每个学生可以为每个任务分配任意数量的成绩,最近的一个是我想在摘要中显示的成绩。
我通常做的是查询学生列表和分配任务列表,然后为每个学生构建一个巨大的嵌套for循环遍历每个任务,查询每个学生的最新成绩,假设30个学生,5个任务,这是152个查询,这总是让我觉得太多了。
我想(希望)我的sql知识有一个非常令人尴尬的差距,并且有一个更聪明的方法来做它。
编辑: 谢谢你的回答 - 我仍然在构建实际的数据库,所以我可以测试它,但我怀疑下面的答案不包括以下问题:
如果学生没有尝试任务/作业,则成绩表中不会有任何条目,但他们仍需要在摘要表中显示每个任务的默认成绩(“u”) 。我认为这有点困难。
再次编辑: 我现在有胚胎数据库,它的工作原理是我得到一个最近成绩的列表,其中没有等级的差距。转置该列表现在是another question的主题!
答案 0 :(得分:1)
SELECT tasks.*, students.*,
(
SELECT grade
FROM grades
WHERE grades.task_id = tasks.task_id
AND grades.username = students.username
ORDER BY
date DESC
LIMIT 1
) AS lastgrade
FROM assignments a
JOIN assignment_tasks at
ON at.assignmentID = a.assignmentID
JOIN assignment_students ast
ON ast.assignmentID = a.assignmentID
JOIN tasks
ON tasks.task_id = at.task_id
JOIN students
ON students.username = ast.username