Для этого вопроса я создал простой пример, иллюстрирующий то, что я прошу.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?
Почему вы хотите формат в таблице 'é', и что бы это даст вам более стол' c'? –
LEFT JOIN может быть решением, попробуйте сделать LEFT JOIN. Причина LEFT JOIN также дает свойство NULL. –
Посмотрите внимательно на его данные. 'LEFT JOIN' не даст ему того, о чем он просит. –