2010-08-24 4 views
2

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

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      | 
+----+-----------------------------+ 

ответ

2

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

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 
+0

отличное решение. отлично работает :) полностью забыл возможное самостоятельное присоединение. –

+0

@Henrik P. Hessel: это 'b.user> a.user', который возвращает одну строку вместо пары. –

+0

пытается понять b.user> a.user, но кажется, что уже поздно;) –

1

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

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 

Не уверен, что если он будет работать.

1

Это должно вас происходит:

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, если вам нужны фактические имена пользователей и т. Д.

+0

OMG Ponies, вы избили меня до него ... и вы сохранили уникальный идентификатор с помощью «b.user1_id> a.user1_id». Ницца. – Shoeless