2013-01-24 43 views
1

我有一張訂單表。每個訂單都有一個發件人和一個收件人。發件人和收件人都在客戶表中。每個客戶有時可能是發件人或收件人,所以我沒有選擇將他們分成發件人和收件人表。從1加入左側得到2結果

我現在停留在構建(在一個查詢中)一個JOIN,這會讓我有兩個客戶(一個作爲發件人,一個作爲接收者),我可以將其識別爲「正確」類型的客戶。

我可以做一個標準的LEFT JOIN,

SELECT o.date,c.last_name,c.first_name,c.company,c.email 
FROM orders o 
LEFT JOIN customers c ON (o.sender = c.id) 
WHERE o.id = 2"; 

但這隻會讓我對發送者的信息。我可以將o.sender更改爲o.receiver,但這隻會讓我獲得接收器的信息。

我該如何得到兩者並區分哪兩個是發送者和哪個接收者?

由於提前,

回答

1

你可以上的ON子句中使用一個或加盟:

SELECT o.date, c.last_name, c.first_name, c.company, c.email, 
     case when o.sender=c.id then 'Sender' 
      when o.receiver=c.id then 'Receiver' end as kind_of_customer 
FROM orders o 
     LEFT JOIN customers c ON o.sender = c.id or o.receiver = c.id 
WHERE o.id = 2; 

和使用的案件時,如果它是一個發送者你能辨別或如果它是一個接收器。

+0

你將有一個發件人線和一個接收機... –

+0

@RaphaëlAlthaus是的!結果是兩行,我不確定這是OP所尋找的,但是閱讀這個問題,我認爲它應該沒問題。...... – fthiella

0

您可以加入customer表兩次。一旦將返回sender,另一個將返回receiver

SELECT o.date, 
    c1.last_name, 
    c1.first_name, 
    c1.company, 
    c1.email, 
    c2.last_name, 
    c2.first_name, 
    c2.company, 
    c2.email 
FROM orders o 
LEFT JOIN customers c1 
    ON o.sender = c1.id 
LEFT JOIN customers c2 
    ON o.receiver = c2.id 
WHERE o.id = 2"; 

如果你想使用更具描述性的別名,那麼你可以使用:

SELECT o.date, 
    sender.last_name, 
    sender.first_name, 
    sender.company, 
    sender.email, 
    receiver.last_name, 
    receiver.first_name, 
    receiver.company, 
    receiver.email 
FROM orders o 
LEFT JOIN customers sender 
    ON o.sender = sender.id 
LEFT JOIN customers receiver 
    ON o.receiver = receiver.id 
WHERE o.id = 2"; 
+0

輝煌,做兩個連接將做到這一點。非常感謝 –