0

PHPで「知っている人」スクリプトを作成しました。このスクリプトは、php フレンド システムで、私のフレンドのフレンドを表示します。users (user_id, name, surname, email, profile)ユーザーに関する情報を保持するというテーブルがあります。friends(friend_id, user_one, user_two)フレンドであるユーザーの ID を保持する別のテーブルが呼び出されます。私のコードは次のとおりです。

<?php
  // ------ gives me my friends

  $friend_query = mysql_query("  SELECT `user_one`, `user_two` FROM `friends` WHERE `user_one`='$session_user_id' OR `user_two`='$session_user_id' ");  

  while($run_friend = mysql_fetch_array($friend_query)){
    $user_one = $run_friend['user_one'];
    $user_two = $run_friend['user_two'];

    if($user_one == $session_user_id){
      $user = $user_two;
    } else {
      $user = $user_one;
    }

    $friend_id = getuser($user, 'user_id');


    // ----- gives me friends of my friends
    $friend_query_two = mysql_query("  SELECT `user_one`, `user_two` FROM `friends` WHERE (`user_one`='$friend_id' and `user_two` != '$session_user_id') OR (`user_one`!='$session_user_id' and `user_two`='$friend_id' )  ");  

    while($run_friend_two = mysql_fetch_array($friend_query_two)){                          
      $user_one_two = $run_friend_two['user_one'];
      $user_two_two = $run_friend_two['user_two'];

      if($user_one_two == $friend_id){
        $user_two = $user_two_two;
      } else {
        $user_two = $user_one_two;
      }

      $friend_id_two = getuser($user_two, 'user_id');
      // ------- gives me friends of my friends that are my friends also

      $check_friend_query = mysql_query("  SELECT friends_id from friends WHERE  (user_one='$session_user_id' AND user_two='$friend_id_two') OR (user_one='$friend_id_two' AND user_two='$session_user_id')  ");

      if (mysql_num_rows($check_friend_query) != 1){ 
        //here is the problem where I get duplicate values about friends of my friends

        $my_friend = $friend_id_two;
        $friends_friends = mysql_query("SELECT `user_id`, `name`, `surname`, `email`, `profile` FROM `users` WHERE (`user_id`='$my_friend')  ");

        while ($run_friends= mysql_fetch_assoc($friends_friends)) {
          $friend_user_id = $run_friends['user_id'];
        }
?>

私のコードは正常に動作し、友達の友達を私に与えてくれます。問題は、重複した値が得られることです。これを回避する方法はありますか?

4

7 に答える 7

0

友達用の「多対多」テーブルの方がいいと思います

お気に入り:

Table Friends

user Friend
  0    11
  0    58
  0    87
  1    35
  2    44
  2    98

その後、あなたはすることができます"SELECT Friend FROM Friends WHERE user = $user";

于 2013-09-04T14:42:19.017 に答える
0

更新しました

PHP の実装は次のようになります。

global $db;
$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD');

$friends = getFriendsOf( $session_user_id );
$friends_of_friends = getFriendsOf( $friends );

// Do whatever you want right here
// with your friends ($friends)
// and your friends' friends ($friends_of_friends)

function getFriendsOf( $user ) {
    global $db;

    if ( is_array( $user ) ) $where = ' IN (' . implode( ',', $user ) . ')';
    else $where = ' = ' . $user;

    $sql = "
SELECT GROUP_CONCAT( f.user_id ) as friends
  FROM (SELECT user_one as user_id
          FROM friends
         WHERE user_two {$where}
         UNION DISTINCT
        SELECT user_two
          FROM friends
         WHERE user_one {$where}
       ) f";

    $results = $db->query( $sql );
    $row = $results->fetch();
    return explode( ',', $row[ 'friends' ] );
}

オリジナル

テストするデータがありません。しかし、このような何かがうまくいくはずです。

友達を得る:

SELECT u.*
  FROM (SELECT user_one as user_id
          FROM friends
         WHERE user_two = '$session_user_id'
         UNION DISTINCT
        SELECT user_two
          FROM friends
         WHERE user_one = '$session_user_id'
       ) f
  JOIN users u
    ON u.user_id = f.user_id

友達の友達を取得:

SELECT u.*
  FROM (SELECT DISTINCT user_one as user_id
          FROM friends
         WHERE user_two IN (SELECT user_one as user_id
                              FROM friends
                             WHERE user_two = '$session_user_id'
                             UNION DISTINCT
                            SELECT user_two
                              FROM friends
                             WHERE user_one = '$session_user_id'
                           )
         UNION DISTINCT
        SELECT DISTINCT user_two
          FROM friends
         WHERE user_one IN (SELECT user_one as user_id
                              FROM friends
                             WHERE user_two = '$session_user_id'
                             UNION DISTINCT
                            SELECT user_two
                              FROM friends
                             WHERE user_one = '$session_user_id'
                           )
       ) f
  JOIN users u
    ON u.user_id = f.user_id
于 2013-09-04T15:12:08.220 に答える