Объединение в несколько столбцов - PullRequest
2 голосов
/ 17 марта 2019

У меня есть база данных, которая позволяет вести все обмены продуктами между разными магазинами. Вот таблицы:

Таблица доставки:

+-------------+-----------+----------------+---------+
| delivery_id | origin_id | destination_id | ongoing |
+-------------+-----------+----------------+---------+
|          15 |         1 |              2 |       1 |
|          16 |         3 |              4 |       0 |
+-------------+-----------+----------------+---------+

Таблица сайта:

+---------+------------+----------------+
| site_id |       name |        address |
+---------+------------+----------------+
|       1 |     site_1 |            ... | 
|       2 |     site_2 |            ... | 
+-------------+--------+----------------+

Идентификаторы отправителя и получателя являются внешними ключами, ссылающимися на site_id.

Моя цель - перечислить все текущие поставки с названиями магазинов отправления и назначения. Для приведенного выше примера ожидаемый результат будет:

+---------+------------+
| origin  |destination |
+---------+------------+
|  site_1 |     site_2 |
+---------+------------+

На данный момент я нашел единственный способ выбрать идентификаторы пункта назначения и источника с соответствующим идентификатором доставки и затем объединить эти два результата:

SELECT origin.origin, destination.destination FROM (SELECT site.name AS origin,delivery.delivery_id FROM delivery INNER JOIN site on site.site_id=delivery.origin_id WHERE delivery.ongoing=1) origin INNER JOIN (SELECT site.name as destination,delivery.delivery_id FROM delivery INNER JOIN site ON site.site_id=delivery.destination_id WHERE delivery.ongoing=1) destination ON origine.code=destination.code

Я почти уверен, что есть более простой и эффективный способ сделать это, но я не могу его найти. Кто-нибудь может подтвердить?

1 Ответ

3 голосов
/ 17 марта 2019

Вы, кажется, просто хотите два соединения:

select so.name as origin_name, sd.name as destination_name
from deliveries d left join
     sites so
     on d.origin_id = so.site_id left join
     sites sd
     on d.destination_id = sd.site_id
where d.ongoing = 1;

Используется left join на тот случай, если один из столбцов в delivery имеет значение NULL. Это на самом деле кажется маловероятным в этом случае, поэтому внешнее соединение, вероятно, не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...