3

私はこれを行う方法を理解しようとしてきましたが、他の例を見ても理解できないので、個人的な助けを得ることができるかもしれません。

2つのテーブルがusers_statusありfriendshipsます。

users_statusテーブルには、フィールドと他のいくつかのフィールドがありuseridます。表には、、、、およびfriendshipsのフィールドがrequest_toあります。request_fromfriendship_status

基本的に私がやりたいのは、現在のユーザーと現在のユーザーの友達($ userid変数を使用してPHPで指定できます)によるすべてのステータス投稿を取得することです。

friendshipsこれがテーブル構造の例です。フレンドリクエストが送信されると、送信者と受信者のユーザーIDがfriendship_status 0でテーブルに配置されます。リクエストが受け入れられると、friendship_statusは1に設定され、これら2つはフレンドになります。

friendship_id   request_from    request_to  friendship_status
1               111248          111249      1
2               111209          111249      1
3               111209          111248      0
11              111209          111259      1
5               111252          111209      1
12              111261          111209      1

特にサイトは人間関係に基づいており、友情のつながりをチェックしなければならないことが頻繁に使用されるため、これは友情を決定するための最良の構造ではないかもしれないことを私は理解しています。

friend_requestsとのために2つの別々のテーブルを持っている方がおそらく良いでしょうfriendshipsか?もしそうなら、私はどのようにfriendshipsテーブルを構築/管理しますか?

4

2 に答える 2

4

テーブル結合(例: http: //dev.mysql.com/doc/refman/5.0/en/join.html)を使用して、すべてのリクエストを検索できます。

実際には、ここでサブクエリを使用できます。

SELECT * FROM users_status WHERE userid = "$userid" 
    OR userid in (SELECT request_to   FROM friendships where request_from = "$userid" AND friendship_status = 1)
    OR userid in (SELECT request_from FROM friendships where request_to   = "$userid" AND friendship_status = 1)

$useridユーザーIDに置き換えます

于 2011-10-06T02:08:31.017 に答える
3

私が考えることができる最も単純なスキーマは次のとおりです。

PENDING_FRIENDSHIPS(request_from, request_to)
FRIENDSHIPS(request_from, request_to)

また、両方のテーブルの両方のフィールドが複合主キー(request_from、request_to)になるため、IDを削除しました。

現在のユーザーからすべての友達を取得するには、次のコマンドを実行します。

select * from friendships
where $currentUser = request_from OR $currentUser = request_to

これにより両方の列が返され、PHPで現在のユーザーを削除する必要があります。

このスキーマからすべての友達を取得する別の方法は、UNIONを実行することです。

select request_from from friendships
where request_to = $currentUser
UNION
select request_to from friendships
where request_from = $currentUser

このソリューションの欠点は、2つの選択を実行していることです

于 2011-10-06T02:35:45.530 に答える