На практике я столкнулся с ситуацией, когда нужно было выбрать данные из двух связанных сущностей при помощи полного соединения. К сожалению, MySQL пока не поддерживает FULL OUTER JOIN. Ниже приведен пример эмуляции этого вида JOIN. Задача: у нас есть 2 сущности (1 — авторы книг, 2 — сами книги), книга может не иметь автора (допустим, Библия). Нам нужно выбрать всех авторов с их книгами (при чем, если у автора нет книг, то его нужно выбрать тоже). Таблица author.
CREATE TABLE author(
id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR (20) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO author (name) VALUES ('Виктор Пелевин');
INSERT INTO author (name) VALUES ('Лама Оле Нидал');
INSERT INTO author (name) VALUES ('Иван Иванов');
Таблица book.
CREATE TABLE book(
id BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT,
author_id BIGINT (20) UNSIGNED DEFAULT NULL,
title VARCHAR (20) DEFAULT NULL,
PRIMARY KEY (id)
)
INSERT INTO book (author_id, title) VALUES (1, 'Чапаев и пустота');
INSERT INTO book (author_id, title) VALUES (1, 'Generation P');
INSERT INTO book (author_id, title) VALUES (2, 'Будда и любовь');
INSERT INTO book (author_id, title) VALUES (NULL, 'Библия');
Эмуляцию FULL OUTER JOIN сделаем при помощи совместного использования LEFT JOIN и RIGHT JOIN.
SELECT
a.name,
b.title
FROM
author AS a
LEFT JOIN
book AS b
ON a.id = b.author_id
UNION
SELECT
a.name,
b.title
FROM
author AS a
RIGHT JOIN
book AS b
ON a.id = b.author_id
В итоге мы получим следующие данные.
| name | title |
| Виктор Пелевин | Чапаев и пустота |
| Виктор Пелевин | Generation P |
| Лама Оле Нидал | Будда и любовь |
| Иван Иванов | NULL |
| NULL | Библия |