2017-01-29 5 views

ответ

0

Вот один трюк с использованием JOIN с IN условием

SELECT Max(CASE WHEN FromID = u.UserID THEN Username END), 
     Max(CASE WHEN ToID = u.UserID THEN Username END) 
FROM users u 
     JOIN gift g 
     ON u.UserID IN (g.FromID, g.ToID) 
GROUP BY FromID, 
      ToID 

Или вам нужно, чтобы присоединиться к users таблице дважды

SELECT f.Username, 
     t.Username 
FROM gift g 
     LEFT JOIN users f 
       ON f.UserID = g.FromID 
     LEFT JOIN users t 
       ON t.UserID = g.ToID 
0

Похоже, вам нужно резюмировать о том, как работать с несколькими взаимоотношений между те же две таблицы.

Ваша подарочная таблица имеет отношения, которые описывают, кто дал подарок - я называю это дарителем здесь; и отношения, которые описывали, кто получил подарок - я называю это получателем здесь. Оба отношения от подарка много-к-одному к таблице пользователей.

Вы просто присоединяетесь к одной таблице дважды и дадите этой таблице хорошее имя корреляции - получатель и получатель в моем примере - чтобы показать в коде, для чего вы их используете.

Как так:

WITH 
gift(fromid,toid) AS (
      SELECT 1,2 
UNION ALL SELECT 2,6 
UNION ALL SELECT 3,2 
UNION ALL SELECT 5,3 
) 
, 
users(userid,username) AS (
      SELECT 1,'A' 
UNION ALL SELECT 2,'B' 
UNION ALL SELECT 3,'C' 
UNION ALL SELECT 4,'D' 
UNION ALL SELECT 5,'E' 
UNION ALL SELECT 6,'F' 
) 
SELECT 
    giver.username as fromUser 
, receiver.username as toUser 
FROM gift 
JOIN users AS giver 
    ON gift.fromid=giver.userid 
JOIN users AS receiver 
    ON gift.toid =receiver.userid 
ORDER BY 1,2 
; 

fromUser|toUser 
A  |B 
B  |F 
C  |B 
E  |C