FULL OUTER JOIN
2 марта 2012 MySQL 10592 просмотра
На практике я столкнулся с ситуацией, когда нужно было выбрать данные из двух связанных сущностей при помощи полного соединения. К сожалению, 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
В итоге мы получим следующие данные.

nametitle
Виктор ПелевинЧапаев и пустота
Виктор ПелевинGeneration P
Лама Оле НидалБудда и любовь
Иван ИвановNULL
NULLБиблия