Как получить все строки одной таблицы после объединения? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть база данных с 3 таблицами: students, courses и mistakes.У меня есть одна соединительная таблица (csm), где я соединяю 3 таблицы.Я предполагаю, что ошибки одинаковы для каждого курса.

Столовые курсы

+----------+---------------+
| crs_id   | crs_name      |
+----------+---------------+
| 1        | HTML          |
| 2        | PHP           |
| 3        | Python        |
+----------+---------------+

Стол студентов

+----------+---------------+---------------+
| stu_id   | stu_firstname | stu_lastname  |
+----------+---------------+---------------+
| 1        | Tina          | Turner        |
| 2        | Lisa          | Laroi         |
| 3        | Dina          | Donna         |
| 3        | Jim           | Leduc         |
+----------+---------------+---------------+

Ошибки таблицы

+----------+---------------+------------+
| mis_id   | mis_name      | mis_weight |
+----------+---------------+------------+
| 1        | No camelCase  | 7          |
| 2        | No brackets   | 10         |
| 3        | Operator mist.| 12         |
+----------+---------------+------------+

Присоединение к столу CSM

+----------+------------+------------+------------+
| csm_id   | fk_crs_id  | fk_stu_id  | fk_mis_id  |
+----------+------------+------------+------------+
| 1        | 1          | 1          | 1          |
| 2        | 1          | 1          | 3          |
| 3        | 2          | 3          | 1          |
| 4        | 3          | 2          | 2          |
| 5        | 3          | 2          | 1          |
| 6        | 3          | 3          | 1          |
+----------+------------+------------+------------+

Если я выберу конкретный курс, я хочу получить список ВСЕХ студентов с минусом баллов за этот курс.Поэтому я также хочу получить студентов без результата в таблице присоединения CSM.

Ближайший результат, который я получил, с помощью следующего выражения SQL:

select stu_firsname, stu_lastname, csm.*, sum(mis_weight) 
from students s
left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id
left join mistakes m on csm.fk_mis_id = m.mis_id
where fk_crs_id = 4 or fk_crs_id is null
group by stu_firstname;

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

Как получить этих студентов в моей таблице результатов?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

В вашем запросе:

left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id`
...
where fk_crs_id = 4 or fk_crs_id is null

Это не совсем то, что вам нужно, поскольку это условие отфильтровывает студентов, у которых есть записи в таблице csm, только для курсов, отличных от 4.Вы хотите переместить это условие в соответствующее LEFT JOIN:

left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id AND csm.fk_crs_id = 4

Другим потенциальным источником проблем является способ, которым запрос обрабатывает агрегацию.В предложении SELECT есть неагрегированные столбцы, которые не отображаются в предложении GROUP BY.Этот синтаксис не является хорошей практикой кодирования SQL и больше не поддерживается начиная с версии 5.7 MySQL.Я предположил, что вы хотите одну запись в результате для каждого учащегося.

Запрос:

select 
    s.stu_firstname, 
    s.stu_lastname, 
    sum(m.mis_weight) total_misses_weight
from 
    students s
    left join crs_stu_mis csm on s.stu_id = csm.fk_stu_id AND csm.fk_crs_id = 3
    left join mistakes m on csm.fk_mis_id = m.mis_id
group by 
    s.stu_id, 
    s.stu_firstname, 
    s.stu_lastname

Демонстрация по DB Fiddle для идентификатора курса 3:

| stu_firstname | stu_lastname | total_misses_weight |
| ------------- | ------------ | ------------------- |
| Tina          | Turner       |                     |
| Lisa          | Laroi        | 17                  |
| Dina          | Donna        | 7                   |
| Jim           | Leduc        |                     |
0 голосов
/ 26 февраля 2019

, если ваши первичные данные находятся в таблице CSM, попробуйте это:

select s.stu_firsname, s.stu_lastname, csm.*, sum(m.mis_weight) from crs_stu_mis csm
join  students s on s.stu_id = csm.fk_stu_id
join mistakes m on csm.fk_mis_id = m.fou_id
csm.fk_crs_id = 4
group by s.stu_naam;

Второй случай: ваши данные могут зависеть от группы по атрибуту, попробуйте атрибут, чтобы они не были NULL, например:

select s.stu_firsname, s.stu_lastname, csm.*, sum(m.mis_weight) from crs_stu_mis csm
join  students s on s.stu_id = csm.fk_stu_id
join mistakes m on csm.fk_mis_id = m.fou_id
csm.fk_crs_id = 4
group by csm.csm_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...