Recuperer les amis qui ne sont pas communs à deux utilisateurs.

Par Mohamed Lamine Toure, il y a 8 ans


Base de données MySQL

Bonjour,

Voila mes tables:

friends:
| id_invitation
| id_exp
| id_des
| active

users:
| id
| prenom
| nom
| email
| password

j'ai deux requetes:

1: la premiere me retourne la liste des amis.

SELECT * FROM users U JOIN friends F ON ( U.id = F.id_exp AND F.id_des = :id ) OR ( U.id = F.id_des AND F.id_exp = :id ) WHERE U.id <> :id AND F.active = 1

2: la seconde me retourne uniquement les amis communs entre deux utilisateurs.

SELECT u.id, u.nom, u.prenom, u.avatar FROM users u INNER JOIN ( SELECT id_exp, id_des FROM friends WHERE id_exp IN(:id_exp, :id_des) AND active = 1 UNION SELECT id_des, id_exp FROM friends WHERE id_des IN(:id_exp, :id_des) AND active = 1 ) tmp ON tmp.id_des = u.id GROUP BY u.id HAVING COUNT(*) = 2

Je veux une requete qui va joindre les deux requetes(en haut) pour me retourner uniquement les amis qui ne sont pas communs aux deux utilisateurs.
J'ai fait quelque recherches, on m'a parler de DISTINCT mais je ne trouve de solution.

3 réponses

Pierrot01, il y a 8 ans

Salut
La même avec NOT IN
ce serait pas mail
@plus

Pierre

Mohamed Lamine Toure, il y a 8 ans

"La même avec NOT IN"
Comment?
J'ai essayé celà:

SELECT * FROM users U INNER JOIN friends F ON ( U.id = F.id_exp AND F.id_des = :id ) OR ( U.id = F.id_des AND F.id_exp = :id ) WHERE (U.id <> :id_k AND F.active = 1) AND NOT IN(SELECT u.id, u.nom, u.prenom, u.avatar FROM users u INNER JOIN ( SELECT id_exp, id_des FROM friends WHERE id_exp IN(:id_exp, :id_des) AND active = 1 UNION SELECT id_des, id_exp FROM friends WHERE id_des IN(:id_exp, :id_des) AND active = 1 ) tmp ON tmp.id_des = u.id GROUP BY u.id HAVING COUNT(*) = 2)

Ca produit plutôt une erreur.
Merci.

kaspa, il y a 8 ans

C'est quoi la clef de jointure entre les tables ?