2010-08-24 6 views
2

Heh les gars,
J'ai besoin d'aide pour une requête MySQL. La sortie de la requête devrait ressembler à ceciAide MySQL Query

User1  User2 
xxx1  xxx2 
xxx3  xxx1 

mais pas

User1  User2 
xxx1  xxx2 
xxx2  xxx1 

et ainsi de suite.

J'ai besoin de toutes les "amitiés" entre différents utilisateurs. Une amitié existe quand

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 

Merci à l'avance!

Amitié Tableau

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

Tableau utilisateur

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

Répondre

2

Utilisation:

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 

Vous aurez à inverser la comparaison user1_id si vous voulez que les valeurs de la colonne inversée:

AND b.user1_id < a.user1_id 
+0

excellente solution. fonctionne bien :) totalement oublié une éventuelle auto-rejoindre. –

+0

@Henrik P. Hessel: c'est le 'b.user> a.user' qui retourne une ligne au lieu de la paire. –

+0

en essayant de comprendre le b.user> a.user mais il semble qu'il est en retard;) –

1

Vous pouvez essayer:

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 

Je ne sais pas si cela va fonctionner.

1

Cela devrait vous y aller:

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 

Vous pouvez toujours rejoindre la table Utilisateur si vous avez besoin de noms d'utilisateurs réels, etc.

+0

OMG Poneys, vous me battez à lui ... et vous gardez le id est unique avec le "b.user1_id> a.user1_id". Agréable. – Shoeless