MySQL ничего не дает, потому что внешний ключ равен NULL - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу назначить одному-трем людям тему.Затем я хочу получить задание для определенного предмета.

У меня есть одна таблица SUBJECTS, в которой есть дюжина предметов (столбцы: id (PK), name).У меня есть одна таблица USERS, в которой есть дюжина пользователей (столбцы: id (PK), firstName, lastName и т. Д.)

Затем я создал таблицу AS_SUBJECTS, в которой есть следующие столбцы (все из которыхявляются целыми числами):

id(PK), subjectName, user1, user2, user3  

Отношения:

  • subjectName - FK для subjects.id
  • user1 - FK для users.id
  • user2 - это FK для users.id
  • user3 - это FK для users.id

Я хочу, чтобы user2 и user3 были необязательными, т. е. может быть назначен один, два или три человека.один предмет.Поэтому я допустил NULL на этих столбцах.

Теперь предположим, что я ввожу эти значения в AS_SUBJECTS:

id = 1
subjectName = 1
user1 = 7
user2 = NULL
user3 = NULL

Если я сделаю запрос: SELECT * FROM as_subjects WHERE as_subjects.subjectName = 1;, я получу результаты для всех столбцов, включая столбцы со значениями NULL.

Проблема: мне нужно запросить тему в AS_SUBJECTS, а также получить users.firstName и users.lastName для каждого пользователя, назначенного этому предмету.Поэтому я использую псевдонимы:

SELECT 
    as_subjects.subjectName
    as_subjects.user1
    u1.firstName as user1FirstName
    u1.lastName as user1LastName
    as_subjects.user2
    u2.firstName as user2FirstName
    u2.lastName as user2LastName
    as_subjects.user3
    u3.firstName as user3FirstName
    u3.lastName as user3LastName
FROM as_subjects
JOIN subjects ON as_subjects.subjectName = subjects.id
JOIN users u1 ON as_subjects.user1 = users.id
JOIN users u2 ON as_subjects.user2 = users.id
JOIN users u3 ON as_subjects.user3 = users.id
WHERE as_subjects.subjectName = 1;

Запрос действителен, но когда as_subjects.user2 или 3 имеет значение NULL, набор пуст, данных вообще нет.

Есть какие-либо материалы о том, как этого добиться?Все, что я мог найти, это сообщения о том, как выбрать столбцы, где значения NULL.Что мне нужно, это выбрать столбцы NO MATTER, если значение равно NULL.

Ответы [ 2 ]

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

Просто измените [INNER] JOIN s на users на LEFT JOIN s

...
FROM as_subjects
JOIN subjects ON as_subjects.subjectName = subjects.id
LEFT JOIN users u1 ON as_subjects.user1 = users.id
LEFT JOIN users u2 ON as_subjects.user2 = users.id
LEFT JOIN users u3 ON as_subjects.user3 = users.id
...

См. этот пост SO * для подробного обсуждения различных типов соединений.

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

Посмотрите на различные типы объединений - похоже, вы, например, ищете левое внешнее объединение.(т.е. заменяйте JOIN на LEFT OUTER JOIN в ваших примерах, когда вы хотите сохранить строки, в которых таблица справа не соответствует таблицам слева)

https://www.sunnyhoi.com/app/uploads/2017/07/inner-join-vs-cross-join-in-sql-server.jpg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...