0

我有一个名为myfriends2 列的表:

  • friend_id1
  • friend_id2

当某人是某些人的朋友时,将有两条记录。例如,让 4 个成员:1000、1001、1002 和 1003。

如果 1000 和 1001 是彼此的朋友,则将有两条记录:(1000, 1001)(1001, 1000)。为了这个例子,我们假设 1000 也是 1002 的朋友。

我显示与登录用户不是朋友的人(例如,1000),我想在每个人旁边显示共同的朋友数。考虑这个例子,我需要在 1002 前面显示 1,在 1003 前面显示 0。

这是代码和查询的一部分,我使用它来列出所有成员,并在表格中的名称旁边添加为好友按钮。

$query ="SELECT profile_name,friend_id from friends
                    WHERE friend_id<>'$friendID'
                    AND
                    friend_id NOT IN( SELECT friend_id2 from myfriends WHERE friend_id1='$friendID')";

$results = @mysqli_query($conn, $query) or die
$row = mysqli_fetch_row($results);

echo "<table width='50%' border='1'>";
while ($row) {
    echo "<tr><td>{$row[0]}</td>";
    ?>
    <td><button onclick = "window.location.href='friendadd.php?addfriend=<?php echo $row[1];?>'">Add as friend</button></td></tr>
    <?php
    $row = mysqli_fetch_row($results);
}
echo "</table>";

我想在个人资料名称和添加为朋友按钮之间显示每个人的共同朋友数量。

4

2 回答 2

4

尝试这个:

SELECT
   f.profile_name,
   f.friend_id,
   COUNT(DISTINCT m2.friend_id1) AS count_mutual
FROM 
   friends AS f
   LEFT JOIN myfriends AS m1
     ON (m1.friend_id1 = f.friend_id)
   LEFT JOIN myfriends AS m2
     ON (m1.friend_id2 = m2.friend_id1 AND m2.friend_id2 = '$friendID')
WHERE 
   f.friend_id <> '$friendID' 
   AND f.friend_id NOT IN(SELECT 
                           friend_id2 
                        FROM 
                           myfriends
                        WHERE 
                           friend_id1= '$friendID')
GROUP BY
    f.friend_id

您可以看到它在http://sqlfiddle.com/#!2/fc893/2/0上工作。为了计算共同朋友的数量,您需要 2 次加入 myfriends 表,第一次获取您选择的人的所有朋友的列表,第二次检查这些人中谁是 $friendID guy 的朋友。

于 2013-05-18T11:55:17.603 回答
0

假设用户 1 不可能与用户 7 成为朋友两次,(意味着不能有一行 user_a = 1, user_b=7 和另一行 user_a = 7, user_b = 1)。

SELECT IF(user_a = 1 OR user_a = 2, user_b, user_a) friend
FROM friendship
WHERE (user_a = 1 OR user_a = 2) OR (user_b = 1 OR user_b = 2)
GROUP BY 1
HAVING COUNT(*) > 1
于 2014-05-04T06:33:14.870 回答