Как выбрать записи, у которых нет соотв. записей в связанной таблице, а также записи, которые соответствуют условиям?
Таблица 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 |
Реально сделать такой запрос? Заранее благодарен!
Ответы (2 шт):
Автор решения: Qwer Ty
→ Ссылка
Спасибо всем, кто прочитал вопрос. Я уже нашел решение с помощью подзапроса 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)
Автор решения: Виктор Карев
→ Ссылка
Просто перенесите условия фильтра в секцию 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')