2017-10-15 5 views
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 

小補正:彼は2と3の両方を持つ友人であるので、

1は2と3の間の共通の友人であるあなたは2と3で、共通の友人を収集する場合(、あなたが持っているだろう1)。 4は2の友人で3はありません。 3も5と6の友人です.2の友人のリストで検索したいですが、2人から友人を回復したいのですが、3人の友達(この場合は4人)ではありません。 は、私は4だけではなく4,5,6

詳しい情報を返すようにしたい: は、私は2の珍しい友人の3訪問リストは、それが4 を見たとき、私は2の友人だけを返すようにしたいことをしたい人4と同じくらい親切ではありません。

私はそれを説明するのに少し問題があります。

そして私は、そのコードを試してみました:

 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) 

をしかし、それは最悪の場合は動作しません、それはエラーを生成し、問題のページのセクションが表示されていません。 ありがとうございます。

+2

サンプルデータと予想される出力を追加してください。 –

+1

あなたは 'HAVING COUNT(*)= 2'を' HAVING COUNT(*)= 1'に変更する必要があるようです。 –

答えて

0

私はあなたがすでに現在のクエリを使用して相互の友人と非友人の両方の状態に必要な食材を既に持っていると信じています。

SELECT 
     u.id 
    , u.nom 
    , u.prenom 
    , case when count(tmp.id_des) = 1 then 'Not Mutual' 
      when count(tmp.id_des) = 2 then 'Mutual' 
      when count(tmp.id_des) = 0 then 'Alone in this world' 
      else 'Undefined' 
     end as friend_status 
    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 
    , u.nom 
    , u.prenom 
+0

私はあなたのコードを試しましたが、ユーザーの友人が欲しい一方で、他の友人には共通していない間に、ユーザーのすべての友達を返します。 例: 1は2と3の両方の友人であるため、2と3の間の共通の友人です(2と3の共通の友人を集めたい場合は1になります)。 4は2で友人ですが、3ではありません。私は2と3に共通しない友人として4を回復したい。 私は理解されることを望む。 ありがとうございます。 – kam

+0

私の主張は、あなたが既に質問したことです。「私は質問をします...両方のユーザに共通ではない友人のみを返す」あなたがする必要があるのは、** HAVING COUNT(* )= 1 **とそのクエリは、非相互の友人にのみ、または相互と非相互の両方を望む場合は、まったくフィルタリングしないでください。追加したケース式は必要ありません。 –

+0

小修正: 1は2と3の両方の友人であるため、2と3の間の共通の友人です(2と3の共通の友人を集めたい場合は1になります)。 4は2の友人で3はありません。 3も5と6の友人です.2の友人のリストで検索したいですが、2人から友人を回復したいのですが、3人の友達(この場合は4人)ではありません。 は、私は4だけではなく4,5,6 詳しい情報を返すようにしたい: は、私は2の珍しい友人の3訪問リストは、それが4 を見たとき、私はある2の友人だけを返すようにしたいことをしたいです4と親和性がありません。 私はそれを説明するのに少し問題があります。 – kam

関連する問題