Запрос не возвращает NULL

Статус
В этой теме нельзя размещать новые ответы.

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Что-то не понимаю, что делаю не так. Есть таблицы SUBJECTS, SUBJECTS_ON_GROUPS

Задача:
Посмотреть какие предметы установлены каким группам, если предмет не установлен, вывести "-"

Код:
SELECT SUBJECTS.NAME, SUBJECTS_ON_GROUPS.GROUP_ID
FROM SUBJECTS
JOIN SUBJECTS_ON_GROUPS ON SUBJECTS_ON_GROUPS.SUBJECT_ID = SUBJECTS.ID
Этот запрос выводит только предметы которые установлены, а как получить что предмет не установлен в рамках запроса?

Скажем есть предмет А в таблице SUBJECTS, в SUBJECTS_ON_GROUPS для него строк нет. Как вывести в результате

SUBJECT | GROUP_ID
A | NULL
 
В одном запросе сделать не получится, тебе нужно 2 запроса (если решать чисто в рамках SQL), второй из которых LEFT JOIN Для просмотра ссылки Войди или Зарегистрируйся
 
В одном запросе сделать не получится, тебе нужно 2 запроса (если решать чисто в рамках SQL), второй из которых LEFT JOIN Для просмотра ссылки Войди или Зарегистрируйся
2 запроса ты имеешь в виду select from + left join?

С join и проблемы у меня, не возвращает NULL, можешь подсказать как его сделать?
 
2 запроса ты имеешь в виду select from + left join?
С join и проблемы у меня, не возвращает NULL, можешь подсказать как его сделать?

Код:
SELECT subjects.name,subjects_on_groups.subject_id FROM subjects LEFT JOIN subjects_on_groups ON subjects.id = subjects_on_groups.subject_id;

upload_2019-10-9_16-17-56.png
 
Код:
SELECT subjects.name,subjects_on_groups.subject_id FROM subjects LEFT JOIN subjects_on_groups ON subjects.id = subjects_on_groups.subject_id;

Посмотреть вложение 105953
Возможно не так объясняю
Для просмотра ссылки Войди или Зарегистрируйся

В таблице для группы 101 не установлен предмет физика, надо чтобы результат запроса это показал как-то
 

Вложения

  • data.zip
    1.012 байт · Просмотры: 4
Я думаю без пыхи это уже будет какое то сложное решение через процедуры, т.к. SQL не может знать что тебе нужно взять каждый элемент первой таблицы и прокручивать его по наличию второго, причем если второго нету - то писать нулл.
Вынеси логику в обработчик и всё.
 
Можно попробовать с помощью оператора UNION сделать такую выборку
 
Чтобы получить список всех предметов и информацию о группах, к которым они привязаны, включая случаи, когда предмет не привязан ни к одной группе (т.е., когда для предмета нет записей в таблице SUBJECTS_ON_GROUPS), вам следует использовать LEFT JOIN вместо JOIN. LEFT JOIN включит все строки из "левой" таблицы (SUBJECTS), даже если соответствующие строки в "правой" таблице (SUBJECTS_ON_GROUPS) отсутствуют. Для отсутствующих соответствий столбцы "правой" таблицы будут заполнены NULL, что и позволяет отобразить предметы без групп. В вашем случае запрос должен выглядеть примерно так:

SQL:
SELECT
    SUBJECTS.NAME AS SUBJECT,
    COALESCE(SUBJECTS_ON_GROUPS.GROUP_ID, '-') AS GROUP_ID
FROM
    SUBJECTS
LEFT JOIN
    SUBJECTS_ON_GROUPS ON SUBJECTS_ON_GROUPS.SUBJECT_ID = SUBJECTS.ID

В этом запросе используется функция COALESCE, которая возвращает первый не-null аргумент. Это значит, что если SUBJECTS_ON_GROUPS.GROUP_ID равно NULL (то есть, если для предмета не найдено соответствующей группы), будет возвращен символ "-", как вы и хотели.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху