SQL LEFT-JOIN с 2 внешними ключами и объединение их в одну строку (MySQL) - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующие таблицы

Заказы:

id | address1 | address2 | state
1  | 2        | 4        | Delivered
2  | 7        | 1        | Payment

Адрес:

id | city
1  | New York 
2  | Paris   
4  | London 
7  | Berlin

Теперь мне нужно заявление, чтобы получить оба города со статусом заказа.

Например, ID заказа 1 должен вывести: Delivered | Paris | London

Я попробовал следующее утверждение:

SELECT orders.state, address.city FROM orders
  LEFT JOIN address 
    ON orders.address1 = address.id OR orders.address2 = address.id;

Очевидно, он выводит только один адрес города, но я хочу оба.

Есть идеи, как должно выглядеть утверждение?

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Нам нужно прийти к пониманию, что мы должны иметь дело с 2 разными таблицами, а не с 1, так как мы хотим иметь другой набор результатов из одной и той же таблицы. Также нам нужны точные данные, а не дополнительные данные, поэтому мы выбираем Inner Join

Решение:

SELECT O.ID,AD1,A.CITY City1,  o.AD2, b.City City2, STATE FROM ORDERS O
JOIN 
ADDRS A
ON O.AD1=A.ID
JOIN ADDRS b
on  O.AD2=b.ID

В случае, если вам нужны сценарии DDL и DML:

create table orders
(id int , ad1 int, ad2 int,state varchar(20))

insert into orders values
(2,7,1,'Payment')

create table addrs(id int,city varchar(20))

insert into addrs values(1,'NY') 
insert into addrs values(2,'Paris')
insert into addrs values(4,'London')
insert into addrs values(7,'Berlin')

select * from orders
select * from addrs

Надеюсь, что этот ответ больше фокусируется на концепции, а не на Решении

0 голосов
/ 08 мая 2018

Вы хотите иметь псевдонимы для ваших таблиц, это делает его читабельным.

SELECT o1.state, a1.city, a2.city FROM orders o1
  LEFT JOIN address a1 
    ON o1.address1 = a1.id 
  LEFT JOIN address a2
    ON o1.address2 = a2.id 
    ;
0 голосов
/ 08 мая 2018

Попробуйте это

SELECT o.ID, (CASE WHEN o.address1 = a.id THEN a.city) as addy1, 
             (CASE WHEN o.address2 = a.id THEN a.city) as addy2 
FROM Orders as o LEFT JOIN Address as a WHERE ...
0 голосов
/ 08 мая 2018

Вы можете сделать self join:

select o.status, ad.city, ad1.city
from Orders o 
left join Address ad on ad.id = o.address1 
left join Address ad1 on ad1.id = o.address2;
...