Управление результатами из двух подзапросов в MySQL - PullRequest
1 голос
/ 16 февраля 2012

Для домашнего задания мне нужно написать запрос MySQL, чтобы вычислить средний балл каждого ученика в таблице базы данных. Я разбил задачу на 3 части: (1) вычисление количества баллов, полученных каждым учеником, (2) вычисление количества полученных баллов и затем (3) деление баллов за баллы. Вот запросы, которые я написал для шагов 1 и 2:

  1. Рассчитать заработанные баллы:

    SELECT ID, SUM( credits ) AS credits_taken
    FROM takes
    NATURAL JOIN course 
    GROUP BY ID
    

2 Найти заработанные баллы:

    SELECT ID, SUM( credits * ( SELECT points FROM gradepoint WHERE letter = grade ) ) AS tot_grade_points
    FROM takes NATURAL JOIN course
    GROUP BY ID 

Я вручную оценил каждый запрос, и они вернули правильные результаты. Но я не могу понять, как вернуть (credits_taken / tot_grade_points) для каждого студента. Вот что я попробовал:

    SELECT ID, GPA
    FROM student AS S NATURAL JOIN
            (SELECT ID,( 'credits_taken' / SUM( credits * ( SELECT points FROM gradepoint WHERE letter = grade ) )) AS GPA
             FROM takes AS T1 NATURAL JOIN course
             WHERE S.ID = T1.ID
             AND EXISTS (
                           SELECT ID, SUM( credits ) AS 'credits_taken'
                           FROM takes AS T2 NATURAL JOIN course
                           WHERE S.ID = T2.ID
                           GROUP BY ID
                          ) 
             GROUP BY ID) Z
    GROUP BY ID

Но это дает мне ошибку «Неизвестный столбец« S.ID »в« предложении где »». Из того, что я прочитал, вы не можете ссылаться на псевдоним таблицы из подзапроса в операции соединения. У кого-нибудь есть другой способ выполнить вычисление этих двух подзапросов и вернуть их, привязанные к идентификатору студента?

Таблица «принимает» отображает идентификаторы учеников в информацию о курсах, которые они прошли, наиболее важно - course_id и оценку. Таблица «курс» содержит поле «кредиты», количество кредитов, которое стоит курс.

EDIT

Вот соответствующие структуры таблиц:

принимает:

    Field     | Type         | Null | Key | Default | Extra |
   +-----------+--------------+------+-----+---------+-------+
   | ID        | varchar(5)   | NO   | PRI |         |       |
   | course_id | varchar(8)   | NO   | PRI |         |       |
   | sec_id    | varchar(8)   | NO   | PRI |         |       |
   | semester  | varchar(6)   | NO   | PRI |         |       |
   | year      | decimal(4,0) | NO   | PRI | 0       |       |
   | grade     | varchar(2)   | YES  |     | NULL    |       |
   +-----------+--------------+------+-----+---------+-------+

курс:

   +-----------+--------------+------+-----+---------+-------+
   | Field     | Type         | Null | Key | Default | Extra |
   +-----------+--------------+------+-----+---------+-------+
   | course_id | varchar(8)   | NO   | PRI |         |       |
   | title     | varchar(50)  | YES  |     | NULL    |       |
   | dept_name | varchar(20)  | YES  | MUL | NULL    |       |
   | credits   | decimal(2,0) | YES  |     | NULL    |       |
   +-----------+--------------+------+-----+---------+-------+

1 Ответ

1 голос
/ 16 февраля 2012

Я бы попробовал:

SELECT takes.sec_id, 
  SUM( course.credits * gradepoint.points ) / SUM( course.credits ) AS GPA
FROM takes
JOIN gradepoint ON takes.grade = gradepoint.letter
JOIN course ON takes.course_id = course.course_id
GROUP BY takes.sec_id

Поскольку описание структуры вашей таблицы неполное, мне пришлось угадать схему баллов и я предположил, что sec_id идентифицирует ученика в таблице takes, если для этого есть другой столбец, просто замените его в запросе как в SELECT, так и * 1006. * части. Может быть, это ID, но имя столбца обычно используется для первичных ключей. Или, может быть, вообще не определены первичные ключи, что в любом случае является плохой практикой. Кроме того, вам нужно будет присоединиться к таблице student, если вы хотите получить какую-либо информацию о студенте, кроме идентификатора, например, имя и т. Д.

Я бы также рекомендовал использовать синтаксис JOIN ... ON ... вместо NATURAL JOIN, он не только более читабелен, но и дает больше гибкости, например, посмотрите, как объединяется оценка, вместо использования дорогостоящего зависимого подзапроса.

...