0

ここに私のテーブルがあります:

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)

しかし、最悪の場合は機能せず、エラーが発生し、問題のページのセクションが表示されません。ありがとうございました。

4

1 に答える 1