Как прочитать двойную регистрацию для класса в двух отдельных базах данных без подзапросов? SQL - PullRequest
1 голос
/ 15 февраля 2020

Я использую MySQL для введения в курс баз данных. В настоящее время мы практикуем использование агрегатов и объединений для создания новых релевантных столбцов. У меня есть таблица классов, которая содержит информацию о классах, такую ​​как идентификатор класса, имя, код и т. Д. c.

ID  Name                        Description     Code    MaximumStudents
1   Computer Science 310 SQL    NULL            CS-HU310    10
3   Communications              NULL            COMM113     5
4   English                     NULL            ENG101      4
5   Math                        NULL            MA030       5
6   Electrical                  NULL            ECE230      10

У меня также есть таблица ClassStudent, в которой отображаются все учащиеся, записавшиеся на класс, а также время регистрации и коды классов.

//Some data from this table has been removed to avoid unnecessary clutter on the post
ID  ClassID StudentID   SignUpDate
33  3           3   2020-02-04 13:12:23
34  3           7   2020-02-04 13:12:23
38  4           2   2020-02-04 13:20:12
39  4           4   2020-02-04 13:20:12
40  4           5   2020-02-04 13:20:12
41  4           7   2020-02-04 13:20:12
42  4           8   2020-02-04 13:20:12
43  4           9   2020-02-04 13:20:12
45  5           2   2020-02-04 13:35:22
46  5           3   2020-02-04 13:35:22
47  5           4   2020-02-04 13:35:22
48  5           2   2020-02-04 13:35:42
49  5           3   2020-02-04 13:35:42
50  5           4   2020-02-04 13:35:42
51  5           2   2020-02-05 15:57:20
52  5           3   2020-02-05 15:57:20
53  5           4   2020-02-05 15:57:20

Задача состоит в том, чтобы показать, как ученики могли зарегистрироваться в каждом классе дважды, где это применимо. Если вы посмотрите на таблицу выше, то увидите, что есть ученики с идентификаторами 2, 3 и 4, которые записались в класс № 5 3 раза. Поэтому должен быть дополнительный столбец с именем DoubleSignUps.

Используя следующий запрос, я добавил несколько столбцов, чтобы ответить на другие части вопроса, который задают, однако я не могу понять последний столбец.

SELECT Class.ID, Class.Name, Class.Code, Class.MaximumStudents,
COUNT(DISTINCT ClassStudent.StudentID) AS StudentCount,
MIN(ClassStudent.SignUpDate) AS EarliestSignUp,
MAX(ClassStudent.SignUpDate) AS LatestSignUp,
COUNT(ClassStudent.StudentID) AS DoubleSignUp
FROM Class
LEFT JOIN ClassStudent
ON Class.ID=ClassStudent.ClassID
GROUP BY ID;

Любая помощь / объяснение того, как я могу это сделать, будет принята с благодарностью. Все, что мне нужно сделать, это для каждого ClassID, должен быть связан только один StudentID, и любое дополнительное добавит к счетчику двойной регистрации.

EDIT:

Вот база данных, которую я Я ожидаю увидеть

ID  Name                        Description     Code    MaximumStudents DoubleSignUps
1   Computer Science 310 SQL    NULL            CS-HU310    10            0
3   Communications              NULL            COMM113     5             0
4   English                     NULL            ENG101      4             0
5   Math                        NULL            MA030       5             0
6   Electrical                  NULL            ECE230      10            3

ПРИМЕЧАНИЕ. В моем запросе выше также отображаются столбец «Самая ранняя регистрация», «Последняя регистрация» и «Количество студентов», однако в окне недостаточно места для их добавления.

1 Ответ

0 голосов
/ 15 февраля 2020

Вам нужен подзапрос, который группирует по ClassID и StudentID, чтобы получить повторяющиеся регистрации.

SELECT StudentID, ClassID
FROM ClassStudent
GROUP BY StudentID, ClassID
HAVING COUNT(*) > 1

Затем вы можете сгруппировать его по ClassID, чтобы получить количество двойных регистраций для каждого класса. :

SELECT ClassID, COUNT(*) AS DoubleSignups
FROM (
    SELECT StudentID, ClassID
    FROM ClassStudent
    GROUP BY StudentID, ClassID
    HAVING COUNT(*) > 1) AS x
GROUP BY ClassID

Затем вы можете присоединиться к этому со своим исходным запросом.

SELECT Class.ID, Class.Name, Class.Code, Class.MaximumStudents,
    COUNT(DISTINCT ClassStudent.StudentID) AS StudentCount,
    MIN(ClassStudent.SignUpDate) AS EarliestSignUp,
    MAX(ClassStudent.SignUpDate) AS LatestSignUp,
    IFNULL(d.DoubleSignup, 0) AS DoubleSignup
FROM Class
LEFT JOIN (
    SELECT ClassID, COUNT(*) AS DoubleSignup
    FROM (
        SELECT StudentID, ClassID
        FROM ClassStudent
        GROUP BY StudentID, ClassID
        HAVING COUNT(*) > 1) AS x
    GROUP BY ClassID
) AS d ON d.ClassID = Class.ID
LEFT JOIN ClassStudent ON Class.ID=ClassStudent.ClassID
GROUP BY Class.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...