グループまたは個々のユーザーとの共有が必要なサイトを構築しています。Googleがmysqlを使用していないことは知っていますが、自分のサイトでそのような機能をどのように複製できるか疑問に思っていました. g+ では、次のことができます。
- 投稿を「公開」で共有します (全員が閲覧できます)。
- 「すべてのサークル」で投稿を共有します (サークル内の全員が閲覧できます)。
- サークルと個人ユーザーの両方と投稿を共有します。例: post = "my first post" で、家族、友人、ユーザー 1 (Joey tribbiani)、ユーザー 2 (Ross geller) などと共有されます。
条件:
- 投稿がサークルと共有され、新しいユーザーがサークルに追加された場合、そのユーザーはそのサークルで共有された以前の投稿をすべて表示できるはずです。
- ユーザーがサークルから削除された場合。(s)彼がコメントした投稿を除いて、そのサークルと共有されている投稿を見ることはできません。
現在、私のデータベース テーブルは次のようになっています。
Circle_category
Cat_id
Cat_name
user_id
投稿
post_id
user_id
post
is_public
all_circle
サークルに投稿
entry_id
post_id
cat_id
Post_to_user
entry_id
post_id
user_id
ファミリー サークル ( cat_id が 1 の Circle_category にある) のユーザーが表示できる投稿
- 公開されている投稿を見ることができます。
- すべてのサークルで共有されている投稿を表示できます。
- ファミリー サークルと共有されている投稿を表示できます。
- 共有された投稿を見ることができます (個人ユーザー)。
SQL
SELECT p.* FROM posts p
JOIN Post_to_circle pc
ON p.post_id = pc.post_id
JOIN Post_to_user pu
ON p.post_id = pu.post_id
WHERE p.is_public = 1
OR all_circle = 1
OR pc.cat_id = $cat_id
OR pu.user_id = $user_id
質問:
まず、ケース 1 (すべての公開投稿を参照)、ケース 2 (すべてのサークルと共有された投稿) から投稿を取得できましたが、他の 2 つのケースは機能しません。私はそれについて考え、主な問題は、p.is_public = 1 の投稿を取得するために where 句を指定したことであることがわかりました。これは、p.is_public = 0 の行を無視することを意味します。クエリを更新して、すべてをカバーする投稿を表示するにはどうすればよいですか4 つのケースであり、冒頭で説明した条件もカバーしています。
次に、テーブルを構造化するためのより良い方法はありますか? 私はそれを正しい方法で行っているかどうかわかりません。