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


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

Pierre

"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.

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