1

この質問を続けて、

私のWebアプリでは、ユーザーがFacebookなどの友達を追加できるようにしたいのですが、前の質問で、@yidingが言ったようにデータベース構造を使用することにしました。

対称になるように関係を非正規化します。つまり、1と2が友達の場合、2つの行(1,2)と(2,1)があります。

欠点は、サイズが2倍になることです。友情を築いたり壊したりするときは、2回の書き込みを行う必要があります。利点は、すべての読み取りクエリが簡単になることです。ほとんどの場合、書き込みではなく読み取りを行うため、これはおそらく適切なトレードオフです。

これには、最終的に1つのデータベースを超えてユーザーシャーディングを実行することにした場合に、他のすべてのデータベースシャードをトラバースして人の友達を見つける必要がないという追加の利点があります。

したがって、ユーザー1がユーザー2を追加し、ユーザー5が2を追加すると、次のようなものがデータベースに追加されます。

ROW_ID    USER_ID   FRIEND_ID   STATUS
1         1         2           0
2         2         1           0
3         5         2           0
4         2         5           0

ご覧のとおり、最初に「 REQUEST SENDER 」の行を挿入します。ここで、ユーザー5がログインしていて、友情のリクエストを表示したいとします。これが私のクエリです。

$check_requests = mysql_query("SELECT * FROM friends_tbl WHERE FRIEND_ID = '5'");

上記のクエリはROW_ID=4をフェッチします。これは、上記のクエリでは、ユーザー2が5を追加したことを示していますが、実際にはユーザー5がユーザー2を追加していないことを示しているため、ここではユーザー5の友情リクエストを表示しないでください。代わりに、ユーザー2に表示する必要があります。

これを正しくチェックするにはどうすればよいですか?

4

3 に答える 3

2

これは編集された回答です。


SQLクエリは次のようになります。

SELECT USER_ID, FRIEND_ID FROM friends_tbl WHERE FRIEND_ID = '5' OR USER_ID = '5'

次に、この方法で結果を解析する必要があります。あなたがこのようなphp配列を持っていると仮定します:

$result = array(
    0 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 2
    ),
    1 => array(
        'USER_ID' => 2,
        'FRIEND_ID' => 5
    )
    2 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 8
    ),
    3 => array(
        'USER_ID' => 8,
        'FRIEND_ID' => 5
    )
)

偶数行を取得する必要があります。

$result_final = array();
for($i = 0; $i < count($result); $i++) {
    if($i % 2 == 0) $result_final[] = $result[$i];
}

次に、次のような配列が作成されます。

    $result = array(
    0 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 2
    ),
    1 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 8
    )
)

別の方法: SQLを次のようにします。

SELECT FRIEND_ID FROM friends_tbl WHERE USER_ID = '5'

それで全部です。

于 2012-12-25T14:13:02.343 に答える
0

たとえば、あるユーザーから別のユーザーへのすべてのリクエストを含む一時テーブル(またはデータマイニングの場合は固定)を保持する必要があります。

テーブル:friendRequest

inviterId inviteeId status tstamp 
    2           5       0    NOW()
    5           8       0    NOW()

0が未承認であると仮定します。

保留中のすべてのリクエストをクエリするより

SELECT * FROM friendRequest WHERE invitee_id = :currentLoggedUserId AND status = 0

ユーザーがユーザーを承認したら、トランザクションを作成し、この新しく形成された関係を記述し、friendRequestsテーブルを更新します

また、相互に関係のない友情を探すことで、ユーザーが多くのフォロワーを持つ非対称関係をこのように照会することもできます。

于 2012-12-26T08:30:12.287 に答える
0

友情クエリ通知は、メッセージの受信トレイなどに配置する必要があります。あなたが説明した関係は、まあ、友情関係を保持することを意図しており、イベント自体が起こっているという事実ではありません。通知を保持するためのリレーションの作成を検討し、2つの挿入とともに適切に入力する必要があります。friends_tbl

于 2012-12-25T14:30:52.893 に答える