Как выбрать записи, у которых нет соотв. записей в связанной таблице, а также записи, которые соответствуют условиям?

Рейтинг: 0Ответов: 2Опубликовано: 18.05.2023

Таблица users:

id surname
1 Иванов
2 Петров
3 Сидоров
4 Кузнецов

Таблица category

id name
1 Котики
2 Собачки

Таблица posts

id id_user content id_category add_date
1 1 Текст 1 1 2023.01.01
2 1 Текст 2 1 2023.01.02
3 1 Текст 3 2 2023.01.03
4 2 Текст 4 1 2023.01.04
5 1 Текст 5 2 2023.01.05
6 2 Текст 6 2 2023.01.06
7 2 Текст 7 1 2023.01.07

Нужно получить users.surname, category.name, posts.content где: (posts.id_category = 1) И (posts.add_date < '2023.01.03' ИЛИ posts.add_date > '2023.01.05' ИЛИ вообще нет записей в posts). То есть в итоге я хочу получить такое:

users.surname category.name posts.content
Иванов Котики Текст 1
Иванов Котики Текст 2
Петров Котики Текст 7
Сидоров Котики NULL
Кузнецов Котики NULL

Реально сделать такой запрос? Заранее благодарен!

Ответы

▲ 0

Спасибо всем, кто прочитал вопрос. Я уже нашел решение с помощью подзапроса SELECT в WHERE. Кого вдруг будет интересовать подобное - копайте в сторону:

... LEFT JOIN posts ... WHERE ... OR NOT EXISTS (SELECT posts.id FROM posts WHERE posts.id_category = 1 AND users.id = posts.id_user)
▲ 0

Просто перенесите условия фильтра в секцию ON у LEFT JOIN:

SELECT users.surname, category.name, posts.content
FROM users
CROSS JOIN category
LEFT JOIN posts ON (users.id = posts.id_user AND category.id = posts.id_category
 AND posts.id_category = 1 AND (posts.add_date < '2023.01.03' OR posts.add_date > '2023.01.05')