2016-02-10 2 views
0

Для этого вопроса я создал простой пример, иллюстрирующий то, что я прошу.MySQL, объединяющий внешние соединения

Скажем, у меня есть таблица под названием «книги»

+----+----------------------------+-----------+ 
| pk |   title   | author_id | 
+----+----------------------------+-----------+ 
| 1 | The Lost Symbol   |   1 | 
| 2 | Follow Us Home    |   2 | 
| 3 | The Man in the High Castle |   3 | 
+----+----------------------------+-----------+ 
       (table a) 

И еще одна таблица под названием «магазины», что был список магазинов, продающих каждую книгу:

+----+---------+-------------+-------+ 
| pk | book_id | shop_name | price | 
+----+---------+-------------+-------+ 
| 1 |  1 | WHSmith  | 5.00 | 
| 2 |  1 | Waterstones | 7.00 | 
| 3 |  1 | Amazon  | 2.50 | 
| 4 |  2 | WHSmith  | 4.00 | 
| 5 |  2 | Borders  | 4.50 | 
+----+---------+-------------+-------+ 
       (table b) 

Если я делаю простой select, которая захватывает книгу и все места, она продается с помощью join, таких как:

SELECT 
    books.*, 
    shops.shop_name, 
    shops.price 
FROM 
    books 
    JOIN shops ON books.pk = shops.book_id 
WHERE 
    book.book_name = "The Lost Symbol" 

я хотел бы получить такие результаты, как показано ниже:

+----+-----------------+-----------+-------------+-------+ 
| pk |  title  | author_id | shop_name | price | 
+----+-----------------+-----------+-------------+-------+ 
| 1 | The Lost Symbol |   1 | WHSmith  | 5.00 | 
| 1 | The Lost Symbol |   1 | Waterstones | 7.00 | 
| 1 | The Lost Symbol |   1 | Amazon  | 2.50 | 
+----+-----------------+-----------+-------------+-------+ 
         (table c) 

Однако, я хотел бы получить результаты, как это:

+----+-----------------+-----------+-------------+-------+ 
| pk |  title  | author_id | shop_name | price | 
+----+-----------------+-----------+-------------+-------+ 
| 1 | The Lost Symbol |   1 | NULL  | NULL | 
| 1 | The Lost Symbol |   1 | WHSmith  | 5.00 | 
| 1 | The Lost Symbol |   1 | Waterstones | 7.00 | 
| 1 | The Lost Symbol |   1 | Amazon  | 2.50 | 
+----+-----------------+-----------+-------------+-------+ 
         (table d) 

И.Э. первая строка является результатом только левого внешнего соединения, а остальные результаты являются внутренним соединением.

Еще более желательный результат:

+------+-----------------+-----------+-------------+-------+ 
| pk |  title  | author_id | shop_name | price | 
+------+-----------------+-----------+-------------+-------+ 
| 1 | The Lost Symbol |   1 | NULL  | NULL | 
| NULL |   NULL |  NULL | WHSmith  | 5.00 | 
| NULL |   NULL |  NULL | Waterstones | 7.00 | 
| NULL |   NULL |  NULL | Amazon  | 2.50 | 
+------+-----------------+-----------+-------------+-------+ 
          (table e) 

Имея shop_name и price конкатенации и сгруппированы в один ряд, кажется, не работать, как это делает только первый результат от shops, а не все из них, а также в мой сценарий в реальном мире, у меня есть пунктуация в данных, поэтому будьте осторожны с разделителем.

Как я могу получить результат таблицы e?

+0

Почему вы хотите формат в таблице 'é', и что бы это даст вам более стол' c'? –

+0

LEFT JOIN может быть решением, попробуйте сделать LEFT JOIN. Причина LEFT JOIN также дает свойство NULL. –

+0

Посмотрите внимательно на его данные. 'LEFT JOIN' не даст ему того, о чем он просит. –

ответ

1

Вы можете использовать UNION ALL для создания требуемого результирующего набора:

SELECT pk, title, author_id, NULL AS shop_name, NULL AS price 
FROM books 
WHERE books.title = "The Lost Symbol" 

UNION ALL 

SELECT NULL AS pk, NULL AS title, NULL AS author_id, shops.shop_name, shops.price 
FROM books 
JOIN shops ON books.pk = shops.book_id 
WHERE books.title = "The Lost Symbol" 

Первая часть операции объединения возвращает первую строку результата, то есть название книги. Вторая часть возвращает остальные строки, т. Е. Названия магазинов.

Demo here

Смежные вопросы