MySQL Query: мне нужны все "дружеские отношения" между разными пользователями - PullRequest
2 голосов
/ 25 августа 2010

Мне нужна помощь с MySQL Query. Вывод запроса должен выглядеть следующим образом

User1       User2
xxx1        xxx2
xxx3        xxx1

но не

User1       User2
xxx1        xxx2
xxx2        xxx1

и так далее.

Мне нужны все "дружеские отношения" между разными пользователями. Дружба существует, когда

UserId 8 exists in Column User1_id  
UserId 4 exists in Column User2_id  
**AND**
UserId 8 exists in Column User2_id  
UserId 4 exists in Column User1_id 

Таблица дружбы

+----------+----------+
| User1_id | User2_id |
+----------+----------+
|        8 |        4 | 
|        4 |        8 | 
|       29 |        4 | 
|        4 |       10 | 
|       10 |        4 | 
|        8 |       37 | 
|        4 |       29 | 
|       37 |        8 | 
|       37 |        4 | 
|       29 |        8 | 
|        4 |       37 | 
|        8 |       10 | 
|        8 |       29 | 
|        4 |       40 | 
|       40 |        4 | 
|       40 |       29 | 
|       29 |       40 | 
+----------+----------+

Таблица пользователей

+----+-----------------------------+
| id | username                    |
+----+-----------------------------+
|  4 | hhessel                     | 
|  8 | xxx1                        | 
| 10 | xxx2                        |  
| 29 | xxx3                        | 
| 40 | xxx4                        | 
| 37 | xxx5                        | 
| 39 | xxx6                        | 
+----+-----------------------------+

Ответы [ 3 ]

2 голосов
/ 25 августа 2010

Использование:

SELECT a.user1_id, 
       a.user2_id
  FROM FRIENDSHIP a
  JOIN FRIENDSHIP b ON b.user2_id = a.user1_id
                   AND b.user1_id = a.user2_id
                   AND b.user1_id > a.user1_id

Вам придется отменить сравнение user1_id, если вы хотите изменить значения столбца:

AND b.user1_id < a.user1_id
2 голосов
/ 25 августа 2010

Это должно помочь вам:

SELECT    f1.user1_id, f1.user2_id
FROM      friendship f1
LEFT JOIN friendship f2 ON f1.user1_id = f2.user2_id AND f1.user2_id = f2.user1_id
WHERE     f1.user1_id = f2.user2_id

Вы всегда можете присоединиться к таблице User, если вам нужны реальные имена пользователей и т. Д.

1 голос
/ 25 августа 2010

Вы можете попробовать:

select u1.username un0, u2.username un1
  from friendship f inner join user u1 on f.user1_id = u1.id
 inner join user u2 on f.user2_id = u2.id
  left join
   (
     select u2.username un0, u1.username un1
       from friendship f inner join user u1 on f.user1_id = u1.id
      inner join user u2 on f.user2_id = u2.id
   ) b using (un0, un1)
 where un0 is null

Не уверен, что это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...