mysql - объединить две таблицы, чтобы получить данные из тех же таблиц другой строки - PullRequest
1 голос
/ 20 июня 2020

У меня есть две таблицы с именами users и requests, структурированные следующим образом:

пользователи:

+----+----------+------------------------+
| id | name     | email                  |
+----+----------+------------------------+
| 1  | super    | super@test.com         |
+----+----------+------------------------+
| 2  | david    | david@test.com         |
+----+----------+------------------------+
| 3  | smith    | smith@test.com         |
+----+----------+------------------------+
| 4  | philip   | philip@test.com        |
+----+----------+------------------------+

запросы:

+----+---------+----------------------+
| id | inviter | email                |
+----+---------+----------------------+
| 1  | 1       | david@test.com       |
+----+---------+----------------------+
| 2  | 2       | smith@test.com       |
+----+---------+----------------------+
| 3  | 2       | philip@test.com      |
+----+---------+----------------------+

Теперь я хочу объединить эти две таблицы, чтобы получить следующие данные:

+----+----------+------------------------+-----------+
| id | name     | email                  | inviter   |
+----+----------+------------------------+-----------+
| 1  | super    | super@test.com         | null      |
+----+----------+------------------------+-----------+
| 2  | david    | david@test.com         | super     |
+----+----------+------------------------+-----------+
| 3  | smith    | smith@test.com         | david     |
+----+----------+------------------------+-----------+
| 4  | philip   | philip@test.com        | david     |
+----+----------+------------------------+-----------+

Две таблицы будут объединены по атрибуту email. И поле inviter в результирующей таблице - это имя пользователя для соответствующей id, хранящейся в requests таблице под атрибутом inviter.

Я написал этот запрос

select users.id as id, name, users.email as email, name, inviter
from users
left join requests on users.email = requests.email

, который производит следующий результат

+----+--------+-----------------+--------+---------+
| id | name   | email           | name   | inviter |
+----+--------+-----------------+--------+---------+
|  2 | david  | david@test.com  | david  |       1 |
|  3 | smith  | smith@test.com  | smith  |       2 |
|  4 | philip | philip@test.com | philip |       2 |
|  1 | super  | super@test.com  | super  |    NULL |
+----+--------+-----------------+--------+---------+

Может ли кто-нибудь помочь мне написать запрос для получения данных по назначению?

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Вам нужно дважды использовать левое соединение с таблицей пользователей, чтобы получить это, см. Ниже скрипт db и запрос

SELECT US.*, US1.name 
FROM users AS US 
LEFT JOIN requests AS RQ ON RQ.email = US.email
LEFT JOIN users AS US1 ON US1.id = RQ.inviter

DB FIDDLE LINK: ЗДЕСЬ

1 голос
/ 20 июня 2020

Вы должны присоединиться к users к requests и users снова, чтобы получить имя inviter:

select u.*, u2.name inviter
from users u 
left join requests r on r.email = u.email
left join users u2 on u2.id = r.inviter
order by u.id

См. demo . Результатов:

| id  | name   | email           | inviter |
| --- | ------ | --------------- | ------- |
| 1   | super  | super@test.com  |         |
| 2   | david  | david@test.com  | super   |
| 3   | smith  | smith@test.com  | david   |
| 4   | philip | philip@test.com | david   |
0 голосов
/ 20 июня 2020

Вам необходимо присоединиться к столу users во второй раз, чтобы узнать имя приглашающего. Например:

select
  u.*,
  u2.name as inviter
from users u
left join requests r on r.email. = u.email
left join users u2 on u2.id = r.inviter
order by u.id
...