0

共通の友達を取得しようとしています。

次のような構造のテーブルがあります。

 `friends` (   
    `inviter`  int(11) NOT NULL,   
    `accepter`  int(11) NOT NULL,   
    `time` datetime NOT NULL,)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;

私のload_my_friends(##MY ID##);クエリは次のようなものです:

SELECT  p.id , p.name,p.lastname,p.thumb
FROM  friends AS f
RIGHT JOIN  profiles AS p ON ( f.accepter = p.id OR f.inviter = p.id ) 
WHERE  f.inviter = ##MY ID##
OR  f.accepter = ##MY ID##
LIMIT 0 , 5000

共通の友達のデータを取得する方法を教えてください。

注: JCOW、ソーシャル エンジンなどのソーシャル ネットワーク スクリプトは使用していません。


@2 の編集

データベースにはuser1、user2、user3、user4、user5..userXがあります

  • user1 の友達: 2,3,6,7,8
  • user2 の友達: 1,3,4,5,7,8

これらの結果を取得できるクエリが必要です。

     | id  | name |lastname| thumb
    1|  3  |raheel|shan    | /img01.jpg
    2|  7  | arqu |x       | /img02.jpg
    3|  8  |abcdef|hijklmno| /img06.jpg
4

4 に答える 4

2

おそらく理解しやすいクエリは次のとおりです。

SELECT p.* 
FROM 
    (
       -- all friends of User A
       SELECT accepter AS friend_id FROM friends WHERE inviter IN (##User_A_ID##)
       UNION
       SELECT inviter AS friend_id FROM friends WHERE accepter IN (##User_A_ID##)
    ) AS t1
    -- intersect with
    JOIN
    (
       -- all friends of User B
       SELECT accepter AS friend_id FROM friends WHERE inviter IN (##User_B_ID##)
       UNION
       SELECT inviter AS friend_id FROM friends WHERE accepter IN (##User_B_ID##)
    ) AS t2
    ON t1.friend_id = t2.friend_id

    JOIN profiles p on p.id=t1.friend_id
于 2013-01-26T00:01:14.410 に答える
0

2人のユーザー(User_AとUser_B)の間で共有されている友達のリストが必要な場合は、これで十分な場合があります。

SELECT accepter 
FROM   friends 
WHERE  inviter = ##User_A_ID## 
       AND accepter IN ( 
          SELECT accepter 
          FROM   friends 
          WHERE  inviter = ##User_B_ID## )

プロファイルテーブルに参加して、他の関連データを取得します。

于 2013-01-25T21:04:01.997 に答える
0
SELECT * 
FROM profiles p
WHERE p.id IN (
    SELECT f_id 
    FROM (
        SELECT accepter as f_id FROM friends where inviter IN (1,2)
        UNION
        SELECT inviter as f_id FROM friends where accepter IN (1,2)
    ) friends 
    GROUP BY f_id
    HAVING count(*) > 1
)

友情が一意の行であると仮定すると....

于 2013-01-25T22:11:27.957 に答える
0

おそらく誰かがこれを行うためのはるかに簡単な方法を思い付くことができますが、ここに私のやり方があります:

SELECT id,name,lastname FROM profiles, 
  (SELECT *
   FROM friends 
   WHERE  
       (inviter = 1 OR accepter = 1) 
       AND (accepter IN ( 
             SELECT inviter 
             FROM   friends 
             WHERE  accepter = 2 AND inviter != 1)
          OR accepter IN ( 
             SELECT accepter 
             FROM   friends 
             WHERE  inviter = 2 AND accepter != 1)
          OR inviter IN ( 
             SELECT inviter 
             FROM   friends 
             WHERE  accepter = 2 AND inviter != 1)
          OR inviter IN (
             SELECT accepter
             FROM   friends 
             WHERE  inviter = 2 AND accepter != 1)))
    f
    WHERE id != 1 AND (inviter = id OR accepter = id);

ここで、user1 の ID = 1、user2 の ID = 2

見てください - http://sqlfiddle.com/#!2/15951/8

于 2013-01-25T20:15:43.563 に答える