使用MySql JOINS在表中查找常用值

时间:2014-01-07 00:05:07

标签: php mysqli

这是我在数据库中检查共同朋友的方式。

对于前。如果用户有朋友用户:(1,2,3,4),用户2有朋友用户:(2,4,5)我想要显示(2和4)。

有没有更好的方法可以使用MYSQL JOINS来做到这一点?

我有一个users表,其中user_id列包含所有用户ID,friends表包含user_oneuser_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 . ', ';

1 个答案:

答案 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 演示