ここに私のテーブルがあります:
1): テーブル フレンド:
id_invitation
id_exp
id_des
date_invitation
active
2): テーブル ユーザー:
id
prenom
nom
email
password
2 つのクエリがあります。
1: 最初は友達のリストを返します。
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: 2 番目は、2 人のユーザー間の共通の友達のみを返します。
SELECT u.id
, u.nom
, u.prenom
FROM users u
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
小さな修正:
1 は 2 と 3 の両方と友達なので、2 と 3 の間の共通の友達です (2 と 3 で共通の友達を集めたい場合は、1 になります)。4 は 2 とは友達ですが、3 とは友達ではありません。また、3 は 5 と 6 とも友達です。2 の友達リストを検索し、2 から友達を回復しますが、3 とは友達ではありません (この場合は 4)。4,5,6 ではなく 4 のみを返したい
詳細情報: 3 が 2 の珍しい友達のリストにアクセスしたときに 4 が表示されるようにしたい. 4 と友好的でない 2 の友達だけを返したい.
私はそれを説明するのに少し問題があります。
そして、私はそのコードを試しました:
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)
しかし、最悪の場合は機能せず、エラーが発生し、問題のページのセクションが表示されません。ありがとうございました。