这是我在数据库中检查共同朋友的方式。
对于前。如果用户有朋友用户:(1,2,3,4),用户2有朋友用户:(2,4,5)我想要显示(2和4)。
有没有更好的方法可以使用MYSQL JOINS来做到这一点?
我有一个users
表,其中user_id
列包含所有用户ID,friends
表包含user_one
和user_two
列。
$user_one_fr = $db->query("select * from `friends` where `user_one` = '$session_user_id' or `user_two` = '$session_user_id'");
$user_two_fr = $db->query("select * from `friends` where `user_one` = '$user_id' or `user_two` = '$user_id'");
while ($loop_user_one_fr = mysqli_fetch_assoc($user_one_fr)) {
if($loop_user_one_fr["user_one"] == $session_user_id)
$user_one_fr_array[] = $loop_user_one_fr["user_two"];
else
$user_one_fr_array[] = $loop_user_one_fr["user_one"];
}
while ($loop_user_two_fr = mysqli_fetch_assoc($user_two_fr)) {
if($loop_user_two_fr["user_one"] == $user_id)
$user_two_fr_array[] = $loop_user_two_fr["user_two"];
else
$user_two_fr_array[] = $loop_user_two_fr["user_one"];
}
$mutual_fr = array_intersect($user_one_fr_array, $user_two_fr_array);
foreach ($mutual_fr as $fr)
echo $fr . ', ';
答案 0 :(得分:0)
你可以这样做
SELECT f1.friend mutual_friend
FROM
(
SELECT IF(user_one = :user_id, user_two, user_one) friend
FROM friends
WHERE :user_id IN (user_one, user_two)
) f1 JOIN
( SELECT IF(user_one = :session_user_id, user_two, user_one) friend
FROM friends
WHERE :session_user_id IN (user_one, user_two)
) f2
ON f1.friend = f2.friend;
或
SELECT IF(user_one IN(:user_id, :session_user_id), user_two, user_one) mutual_friend
FROM friends
WHERE :user_id IN (user_one, user_two)
OR :session_user_id IN (user_one, user_two)
GROUP BY IF(user_one IN(:user_id, :session_user_id), user_two, user_one)
HAVING COUNT(*) > 1;
示例输出(两种情况下 ):
| MUTUAL_FRIEND | |---------------| | 2 | | 4 |
这是 SQLFiddle 演示