mysql-php запрашивает список для создания таблицы - PullRequest
1 голос
/ 15 июня 2009

У меня некоторое время была такая же проблема с 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 заданий, и у каждого учащегося может быть любое количество оценок для каждого задания, причем самым последним является тот, который я хочу отобразить в сводке .

Что я обычно делаю, это запрашиваю список учеников и список заданий, а затем строю гигантское гнездо для циклического циклического прохождения каждого задания для каждого ученика, запрашивая самую свежую оценку для каждого, предполагая, что 30 учеников , 5 заданий, это 152 запроса, что всегда показалось мне слишком большим.

Я полагаю (надеюсь), что у меня ужасно неловкий пробел в моих знаниях sql, и есть гораздо более умный способ сделать это.

Edit: Спасибо за ответ - я все еще работаю над созданием фактической базы данных, чтобы проверить ее, но я подозреваю, что приведенный ниже ответ не охватывает следующие проблемы:

если учащийся не пытался выполнить задание / задание, в таблице оценок для него не будет записей, но они все равно должны отображаться в сводной таблице с оценкой по умолчанию для каждого задания («и»). , Я думаю, что это немного усложняет.

Снова отредактируйте: У меня сейчас есть база данных эмбрионов, и она работает так, что я получаю список самых последних оценок с пробелами, в которых нет оценок. Перенос этого списка теперь является предметом другого вопроса !

1 Ответ

1 голос
/ 15 июня 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...