1

注文のあるテーブルがあります。各注文には送信者と受信者がいます。送信者と受信者の両方が顧客テーブルにあります。各顧客は、ある時点で送信者または受信者になる可能性があるため、それらを送信者テーブルと受信者テーブルに分割するオプションはありません。

「正しい」種類の顧客として認識できる2人の顧客(1人は送信者、もう1人は受信者)を取得するJOINを(1つのクエリで)作成することに行き詰まっています。

標準の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 に変更できますが、受信者の情報しか取得できません。

両方を取得して、どちらが送信者でどちらが受信者であるかを区別するにはどうすればよいですか?

前もって感謝します、

トン

4

2 に答える 2

1

結合の ON 句で OR を使用できます。

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;

CASE WHEN を使用すると、送信者か受信者かを区別できます。

于 2013-01-24T16:14:40.990 に答える
0

customerテーブルに2回参加できます。1つはを返しsender、もう1つはを返します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 に答える