SQL JOIN и желаемое представление: 2 внешних ключа, ссылающихся на одну и ту же таблицу - PullRequest
0 голосов
/ 19 марта 2019

Я чувствую, что не могу решить свою задачу без помощи сообщества.К сожалению, мои знания SQL слабы.

У меня есть 2 таблицы - user и referral, которые представляют данные об отправителях и рефералах отправителей (у отправителя может быть реферал 1..n, но у реферала может быть только один отправитель).

create table user 
(
    id integer primary key,
    name text,
    email text
);

create table referral 
(
   id integer primary key,
   sender_id integer references user1 (id),
   referral_id integer references user1 (id),
   token text,
   unique (referral_id)
);

Я хотел бы создать 2 запроса - получить все рефералы для конкретного отправителя и другие, чтобы получить отправителя для конкретного реферала.

Для получения всех рефералов:

SELECT user1.name AS "sender", referral.referral_id AS "referral"
FROM user1 
JOIN referral ON referral.sender_id = user1.id
WHERE referral.sender_id = requested sender id;

Вывод:

|  sender  | referral |
+----------+----------+
| John     |     5    |
|  ....    |     ...  |
|----------|----------|

Для получения отправителя для конкретного реферала:

SELECT user1.name AS "sender", referral.referral_id AS "referral"
FROM user1 
JOIN referral ON referral.sender_id = user1.id
WHERE referral.referral_id = requested referral id;

Вывод:

|  sender  | referral |
+----------+----------+
| John     |     5    |

Все в порядке, кроме referral вывода.Я хотел бы видеть реферальное имя вместо id.

Также я хотел бы получить выходные данные для отправителя с определенным рефералом, имя только отправителя, без второго столбца referral, поскольку существует отношение один к одному.

Может ли кто-нибудь помочь мне понять join в моем случае?!

Заранее спасибо!

1 Ответ

1 голос
/ 19 марта 2019

Вы хотите присоединиться к пользователям дважды:

SELECT us.name AS sender, ur.name AS referral
FROM referral r LEFT JOIN
     user1 us
     ON r.sender_id = ur.id LEFT JOIN
     user1 ur
     ON r.referral_id = ur.id
WHERE r.sender_id = ?;

Примечания:

  • Вам нужны псевдонимы таблиц, чтобы вы могли ссылаться на одну и ту же таблицу несколько раз в предложении FROM.
  • Эта логика использует LEFT JOIN, если один из столбцов пуст.
  • Вы должны передать запрошенный идентификатор отправителя, используя параметр, поэтому я использовал ? в качестве заполнителя параметра.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...