1

我有一张订单表。每个订单都有一个发送者和一个接收者。发送者和接收者都在客户表中。每个客户有时可能是发送者或接收者,因此我无法将它们拆分为发送者和接收者表。

我现在陷入了构建(在一个查询中)的 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,但这只会让我获得接收者的信息。

我怎样才能同时获得两者并区分两者中的哪一个是发送者,哪个是接收者?

提前致谢,

4

2 回答 2

1

You could use an OR on the ON clause of the join:

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;

and using a CASE WHEN you can distinguish if it's a sender or if it's a receiver.

于 2013-01-24T16:14:40.990 回答
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";
于 2013-01-24T16:16:26.377 回答