1

最初に状況を設定しましょう。

Xフィールドを持つ「users」テーブルがあります。フィールドは「可視性」を除いて私の質問にはあまり関係ありません。可視性は小さなものであり、値は次のことを意味します(0 =すべての人に見える、1 =友達だけに見える、2 =見えない)。

友達のテーブルもあります(id, user_id, target_user_id)user_idと友達target_user_idです。これまでのところ簡単ですか?

ここが粘着性になります。PHP APIを書いていると、私のクラスメソッドは次のようになります。

public function getUsers($requester, $page, $num) {}
  • これ$requesterは、ユーザーを要求している人のユーザーIDです。
  • これ$pageはページネーションのページ番号です
  • これ$numは1ページあたりのアイテム数です

SQLで実行したいのは$num、可視性フィールドが0または1の場合にusersテーブルからユーザーを取得することです。ただし、可視性フラグが1の場合、ユーザーIDと$requesterがfriendsテーブルのfriendsであることを確認する必要があります。そして、彼らが友達である場合にのみ、そのユーザーを返します。

結果が戻った後、PHPを使用して可視性をフィルタリングすることを考えましたが、たとえば5つのレコードを要求し、1人以上のユーザーが可視性を1に設定していて、リクエスターと友達ではない場合、ページネーション(制限)が台無しになります。これは、SQLを介して完全に実行する必要があります。

可能??

4

2 に答える 2

1

ユーザーと同じ構造の一時テーブル「temp」を作成してみてください。

select * into temp From users where visibility=0 or visibility=1;
Select * from temp, friends where (temp.visibility=0) or (temp.user_id = friends.target_user_id);

一時テーブルを空にすることを忘れないでください。

はい、2番目のクエリを試していません。どのような出力が得られたか教えてください。

select * from users, friends where (users.visibility=0) or (users.visibility=1 and users.user_id = friends.target_user_id);
于 2012-04-17T13:46:24.670 に答える
0

これにはLEFTJOINを使用できると思います。

"SELECT * 
FROM users t1 
LEFT JOIN friends t2 ON t2.user_id=t1.id AND t1.visibility=1
INNER JOIN user t3 ON t3.id=t2.target_user_id
WHERE t1.visibility=0 OR t1.visibility=1
LIMIT ".($page*$num).",".$num
于 2012-04-17T11:36:48.337 に答える