2013-01-24 4 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 절에 대해 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를 사용하거나 그것이 수신기라면.

+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

똑똑하고 두 가지 조인을하면 트릭을 할 것입니다. 고마워. –

관련 문제