0

したがって、ユーザー、投稿、プライベートの 3 つのテーブルがあります。この例では、lizzy は非公開の投稿「Dating」を作成し、彼女のガールフレンドのみが非公開テーブルで「authorized_user_ids」を参照し、投稿テーブルで彼女自身の「user_id」を参照したいと考えています。

users
user_id   user_name
   1        tony
   2        steph
   3        lizzy
   4        adam
   5        lara
   6        alexa


posts
post_id   user_id   post_name   private (0 is public, 1 is private to authorized users)
   1         1       Coding        0
   2         3       Dating        1
   3         3       Show Me       0

private
private_id   post_id   authorized_user_ids
    1           2             2,5,6

非公開の投稿者 user_id と authorized_user_ids のみが lizzy による「Dating」投稿を表示する必要がありますが、lizzy による「Show Me」投稿はすべての人が表示できる必要があります。ログアウトしたユーザーと承認されていないユーザーには何も表示されません。それが最も効率的な方法ですか、それとも次のようにする必要があります。

private
private_id   post_id   authorized_user_id
    1           2               2
    2           2               5
    3           2               6

それが私の最初の質問です。私の 2 番目は、mysql db からデータをプルするときに、php (authorized_user_ids に表示) でそれに取り組むための最良の方法は何でしょうか? posts テーブルの「private」フラグに基づいて 2 番目のクエリを実行しますか? 1 の場合、while ループでクエリを実行してプライベート テーブルから「authorized_user_ids」を取得し、それがログイン ユーザーの $logged_in_id と一致する場合、「Dating」を表示しますか? または、プライベート テーブルと posts テーブルの「post_id」を使用して、「authorized _user_ids」を使用してメイン クエリのどこかに結合する必要がありますか? これを最も効率的に行う方法についてのヘルプをいただければ幸いです。

4

1 に答える 1

2

最初の質問: 私は間違いなく 2 番目のバージョンを使用します。authorized_user_idを CSV として保存すると、データベースの読み取り操作と書き込み操作の両方の効率が大幅に低下します。これは、アプリケーション コードで CSV 値を常に分割し、更新を処理するために不適切な動的 SQL ステートメントを生成することになるためです。そのようなさまざまなデータセットの交差を見つけるのに役立つ PHP コードを記述する必要はありません。SQL を使用してください。

2 番目の質問: 結合を使用します。たとえば、while ループは使用しません

SELECT DISTINCT p.post_id, p.post_name FROM users as u
JOIN posts as p on p.user_id=u.user_id 
LEFT JOIN private pv on pv.post_id=p.post_id
WHERE (p.private=0) OR  (authorized_user_id={$logged_in_id} and p.private=1)

上記 (または非常に類似) は、$logged_in_id が 2 のすべての投稿を一覧表示しますが、$logged_in_id が 4 の場合は公開されている投稿のみを一覧表示します。

于 2013-01-22T00:11:55.890 に答える