Как выбрать пользователя из A, когда у него есть совпадение в B - PullRequest
3 голосов
/ 10 марта 2019

У меня есть 2 таблицы, подобные этой:

TableA

+----+------- --+
| id | name     |
+----+----------+
|  1 | Max      |
|  2 | Susan    |
|  3 | Tom      |
+----+----------+

TableB

+----+----------+----------+
| id | fromUser | toUser   |
+----+----------+----------+
|  1 | 1        | 3        |
|  2 | 1        | 2        |
|  3 | 3        | 1        |
+----+----------+----------+

Теперь я хочу получить Tom в результате, потому что Max дает Tom, а Tom дает Max.

Я знаю Max's ID.

Я пытался:

 select a.*, b.fromUser from TableA a 
 INNER JOIN TableB b 
    ON b.fromUser = a.id OR b.toUser = a.id
    WHERE b.fromUser = 1 AND a.id =! 1 

и множество вариантов этого запроса. Но я либо получил неправильные результаты, либо слишком много!

Ответы [ 4 ]

5 голосов
/ 10 марта 2019

В результате вам нужна 1 строка из TableA, верно?Вы можете использовать EXISTS дважды:

select a.*
from TableA a
where 
  exists (
    select 1 from TableB 
    where fromUser = a.id and toUser = 1
  )
  and
  exists (
    select 1 from TableB 
    where fromUser = 1 and toUser = a.id
  )
3 голосов
/ 10 марта 2019

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

Итак:

select ato.name
from tableB b join
     tableA afr
     on b.fromuser = afr.id join
     tableA ato
     on b.touser = afr.id
where exists (select 1
              from tableB b2
              where b2.fromuser = b.touser and b2.touser = b.fromuser
             ) and
      afr.name = 'Max';

Если вы знаете идентификатор Макса, вам не нужны оба соединения;

select ato.name
from tableB b join
     tableA ato
     on b.touser = afr.id
where exists (select 1
              from tableB b2
              where b2.fromuser = b.touser and b2.touser = b.fromuser
             ) and
      b.fromuser = 1;
2 голосов
/ 10 марта 2019

использовать соединение с таблицей дважды

 select a.name as fromuser,a1.name as touser
  tableB b left join tableA a on
  b.fromUser =a.id
 left join tableA a1 on b.touser=a1.id
1 голос
/ 10 марта 2019

Если вы пытаетесь смоделировать тип отношений графа во второй таблице, и у вас нет уровня глубины, то вы должны выполнить самостоятельное соединение с таблицей как:

Select a.id, a.fromUser, a.toUser, b.toUser as toUser_2 
From TableB a join
     TableB b
on a.toUser = b.fromUser
and a.id < b.id
Output
+----+----------+----------+----------+
| id | fromUser | toUser   |  toUser_2|
+----+----------+----------+----------+
|  1 | 1        | 3        | 1        |
+----+----------+----------+----------+
...