Эмуляция FULL OUTER JOIN в MySQL

O
На сайте с 29.05.2008
Offline
195
752

Здравствуйте.

Есть базы `paragraph`(`paragraph`, `position`) и `figure`(`figure`, `figcaption`, `position`), например, со следующими данными:

Paragraph | 1

Paragraph | 3

Figure | Figcaption | 2.

Нужно слить их воедино по колонке `position`, чтобы в итоге получить следующее:

1 | Paragraph | (NULL) | (NULL)

2 | (NULL) | Figure | Figcaption

3 | Paragraph | (NULL) | (NULL).

LEFT JOIN UNION RIGHT JOIN не выполняет свою функцию, ибо записи не группируются по `position`, эта колонка вовсе дублируется для каждой из таблиц.

edogs software
На сайте с 15.12.2005
Offline
775
#1

А Вы group by `position` точно не забыли дописать?

Мало объеденить, нужно сгруппировать еще.

p.s.: запрос и результат покажите.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
O
На сайте с 29.05.2008
Offline
195
#2

edogs, UNION выводит два `position`, один для первой базы, второй для второй. Соответственно, GROUP BY не для чего писать.

png zoomit.png
edogs software
На сайте с 15.12.2005
Offline
775
#3

Попробуйте как-то так

SELECT a.*, b.* FROM `paragraph` a , figure b

where a.position=b.position or a.position is null or b.position is null

group by a.position, b.position

O
На сайте с 29.05.2008
Offline
195
#4

Решение

SELECT * FROM

(SELECT DISTINCT position FROM paragraph
UNION
SELECT DISTINCT position FROM figure
) t1
LEFT JOIN paragraph USING (position)
LEFT JOIN figure USING (position);
edogs software
На сайте с 15.12.2005
Offline
775
#5

ortegas,

Не вполне решение.

Если в paragraph (или figure ) у Вас будет несколько строк с одним position, то получите на выходе дубли.

Мысль у Вас отличная, но для избавления от дублей надо так


SELECT * FROM
(SELECT position FROM paragraph
UNION
SELECT position FROM figure
) t1
LEFT JOIN paragraph USING (position)
LEFT JOIN figure USING (position)
group by position

И еще момент - distinct в подзапросах не необходим, хотя может ускорить запрос.

O
На сайте с 29.05.2008
Offline
195
#6

edogs, большое вам спасибо за советы. Посмотрите, пожалуйста, мою параллельную тему Секционное хранение статьи в базе данных. Данный запрос, точнее часть запроса, пишется конкретно для реализации описанного в этой теме.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий