0

ユーザーが他のユーザーをフォローし、フォローされることができるアプリを構築しています。

ユーザーは、別のユーザーが誰をフォローしているかを確認することもできます。

ここで、user1がuser2がフォローしている人を見ているとしましょう。user2 がフォローしているすべての人の ID を見つけて、user1 がフォローしている人と比較する必要があります。

user1 と user2 の両方に一致するすべてのユーザーの ID のみを返すのではなく (他のフォーラムで見たことがあります)、user2 のすべてのフォロー ID とユーザー名、およびフォローされている人がフォローされているかどうかを示すフラグを取得する必要があります。また、user1 が続きます。

各クエリの二重 for ループを使用して PHP で動作するようにしましたが、このコードは高価であり、単一の MYSQL クエリではるかに最適化されるのではないかと心配しています。

関連するテーブルと列:

following_table
  follower_id
  followed_id
  following: varchar -- 'true' or 'false'

user_table
  user_id
  user_name

ここに私のPHPコードがあります:

$user_id1 = '1991';
$myFollowingQuery = "SELECT following_table.followed_id, user_table.user_name
                     FROM following_table 
                     INNER JOIN user_table ON
                     following_table.followed_id = user_table.user_id
                     WHERE following_table.following = 'true'
                     AND following_table.follower_id = '$user_id1'";

$user_id2 = '1985';
$userFollowingQuery = "SELECT following_table.followed_id, user_table.user_name
                       FROM following_table 
                       INNER JOIN user_table ON
                          following_table.followed_id = user_table.user_id
                       WHERE following_table.following = 'true'
                       AND following_table.follower_id = '$user_id2'";

$userFollowingResult = mysql_query($userFollowingQuery) 
                             or doResponse('error',"Couldn't connect to the database");
$myFollowingResult = mysql_query($myFollowingQuery) 
                             or doResponse('error',"Couldn't connect to the database");

            for($i = 0; $i< mysql_num_rows($userFollowingResult);$i++){

$loopArray = array(followed_id => mysql_result($userFollowingResult,$i,"followed_id"),
                   followed_name => mysql_result($userFollowingResult,$i,"user_name"));

for($j = 0; $j< mysql_num_rows($myFollowingResult);$j++){
  if(mysql_result($userFollowingResult,$i,"followed_id")
     ==mysql_result($myFollowingResult,$j,"followed_id")) {
     $loopArray['is_following'] = 'true';
     break;
  }
  if($j==mysql_num_rows($myFollowingResult)-1){
    $loopArray['is_following'] = 'false';
    break;
  }
}

$resultArray[$i] = $loopArray;
}

echo json_encode($resultArray);
4

1 に答える 1

1

簡略化されたクエリは次のとおりです。

http://sqlfiddle.com/#!2/6b8d6/3

SELECT
  user.user_id,
  user.user_name,
  he.follower_id AS follower_id,
  IF(me.followed_id,1,0) AS metoo

FROM       following AS he

INNER JOIN user
   ON user.user_id = he.followed_id

LEFT  JOIN following AS me
   ON me.follower_id = 1
  AND me.followed_id = he.followed_id

WHERE he.follower_id = 2
于 2012-07-06T04:27:46.263 に答える