mysql-php查询列表来构建表

时间:2009-06-15 16:25:06

标签: php mysql

我有一段时间和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的主题!

1 个答案:

答案 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