1

私のテーブル「ユーザー」には「友達」がいて、

このような :

+----+------+---------+
| id | name | friends |
+----+------+---------+
|  1 | a    | 0,1,2   |
|  2 | b    | 0,1,3   |
|  3 | c    | 0,1     |
+----+------+---------+

爆発関数を使用して、カンマ (,) で区切られたフレンド ID (0,1,2 ではなく) を 1 つずつ取得するにはどうすればよいですか?

IDはどうやって選ぶの?(例) :

$sql = Select id from users where id = (exploded)

if (mysql_num_rows($sql) > 0 ) {
  $TPL->addbutton('Unfriend');
}else{
  $TPL->addbutton('Add as Friend')
}
4

4 に答える 4

5

ここでの解決策は、実際にはデータベース構造をわずかに変更することです。ユーザーが参照するすべてのユーザーの友人を含む「多対多」のリレーショナル テーブルを作成することをお勧めします。

+---------+-----------+
| user_id | firend_id |
+---------+-----------+
|       1 |         2 |
|       1 |         3 |
|       1 |         4 |
|       2 |         1 |
|       2 |         5 |
+---------+-----------+

値のリストを 1 つのフィールドに格納している場合、それはデータベースの設計が最適化されていないことを示す最初の兆候です。数値を検索する必要がある場合は、そのフィールドにインデックスを配置して効率を高め、データベースを機能させることをお勧めします。その逆ではありません:)

次に、ユーザーが誰かの友達かどうかを調べるために、このテーブルにクエリを実行します -

SELECT * FROM users_friends WHERE 
  `user_id` = CURRENT_USER AND `friend_id` = OTHER_USER

特定のユーザーのすべての友達を取得するには、次のようにします -

SELECT * FROM users_friends WHERE `user_id` = CURRENT_USER
于 2013-01-22T10:23:47.443 に答える
0

続行する方法を明確にする簡単な例:

// Obtain an array of single values from data like "1,2,3"...
$friends = explode(',', $row['friends']);

次に、クエリに戻ります。

// Obtain back data like "1,2,3" from an array of single values...
$frieldslist = implode(',', $friends);
$sql = "SELECT * FROM users WHERE id IN ('" . $frieldslist . "')";
于 2013-01-22T10:19:18.903 に答える
0

ちょっとしたアイデアです。データベースのテーブルを変更します。しばらくすると多くの問題が発生することは確かです。

あなたはこのようなものを持つことができます。

    id      hasfriend
    1          2
    1          3
    2          1 no need to be here (You have this already) 
    2          4 
       .....

これを行うには、一意性またはプログラミングのためにインデックスを使用します。もっといいことを考えてしまうかもしれません。問題へのアプローチを次のように変更します。

于 2013-01-22T10:34:32.467 に答える
0

文字列爆発からのif idの配列を取得するには、次のように使用されます

$my_array = explode("," , $friends);

しかし、おそらく mysqlIN句を使用したほうがよいでしょう

$sql = "Select id from users where id in (".$row['friends'].")";
于 2013-01-22T10:20:20.953 に答える