2011-07-05 12 views
0

私はFacebookのWallビルドのような何かがMySQLデータベースを使用するPHPの上にあります。関連する投稿を選択するにはどうすればいいですか(Facebookの壁に似ています)?

構造:

  • カテゴリーは、管理者によって作成され、頻繁に変更されることを意味しない、
  • グループは、ユーザーによって作られています。それらの数は非常に大きくなる可能性があります。彼らは1つのカテゴリの「子供」のようなものです。
  • 投稿もユーザーによって作成されています。彼らはあるグループの「子供」のようなものであり、そのグループはあるカテゴリの「子供」のようなものです。

最後のものはコメントです。それらは、投稿があるのと同じテーブルに保存されますが、投稿のIDの "返信"行が "親"のように設定されています。ここで

は簡単な例です:

Food (category): 

-> Kebabs (group) 

->-> What's your fave kebab, folks? (post) 

->->-> I love doner kebab! (post too, but displayed as comment) 

関連する記事を選択するとき、私は悩みを持っています。あなたは、私は何らかの形でユーザーに関連する投稿を表示する必要があることがわかります。

現時点ではこれらの関係は以下のとおりです。

  • ユーザーが
  • ユーザーが(そのポストが自分で出来ない場合があります)記事にコメントしている、ポストの著者である、
  • 別のユーザーがコメントしています"私たちの"ユーザーがメンバーであるグループ。

私はそれが1つの複雑なクエリになると思う...そして私の知識はあまりにも短いです。ここで

は、クエリ、次のとおりです。

SELECT `posts`.`id`, `posts`.`created_at`, `posts`.`content`, `posts`.`replies`, `groups`.`id` AS `group_id`, `groups`.`name` AS `group_name`, `users`.`name`, `users`.`surname`, `users`.`avatar` 
FROM `posts` 
JOIN `groups` ON (`groups`.`id` = `posts`.`group_id`) 
JOIN `users` ON (`users`.`id` = `posts`.`user_id`) 
WHERE `posts`.`status` = 1 AND `posts`.`post_id` = 0 AND `posts`.`user_id` = '33' 
ORDER BY `posts`.`id` DESC 
LIMIT 10 
OFFSET 0 

編集:

ここでは、テーブル構造である:

CREATE TABLE `bio_community_categories` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 

CREATE TABLE `bio_community_groups` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `category_id` int(10) unsigned NOT NULL, 
    `user_id` int(10) unsigned NOT NULL, 
    `created_at` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `description` text, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8; 

CREATE TABLE `bio_community_posts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) unsigned NOT NULL, 
    `group_id` int(10) unsigned NOT NULL, 
    `post_id` int(11) unsigned NOT NULL DEFAULT '0', 
    `created_at` int(11) NOT NULL, 
    `content` text NOT NULL, 
    `status` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `replies` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `status` (`status`), 
    KEY `post_id` (`post_id`), 
    KEY `user_id` (`user_id`), 
    KEY `group_id` (`group_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 

CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `surname` varchar(50) NOT NULL, 
    /* Etc.. */ 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `bio_community_categories` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 

CREATE TABLE `bio_community_groups` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `category_id` int(10) unsigned NOT NULL, 
    `user_id` int(10) unsigned NOT NULL, 
    `created_at` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `description` text, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8; 

CREATE TABLE `bio_community_posts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) unsigned NOT NULL, 
    `group_id` int(10) unsigned NOT NULL, 
    `post_id` int(11) unsigned NOT NULL DEFAULT '0', 
    `created_at` int(11) NOT NULL, 
    `content` text NOT NULL, 
    `status` tinyint(1) unsigned NOT NULL DEFAULT '1', 
    `replies` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `status` (`status`), 
    KEY `post_id` (`post_id`), 
    KEY `user_id` (`user_id`), 
    KEY `group_id` (`group_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 

CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL, 
    `surname` varchar(50) NOT NULL, 
    /* Etc.. */ 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

グループ、投稿、コメント、カテゴリ、ユーザーなどのテーブル構造を教えてください。 – sudheshna

+0

@sudheshnaここ! – daGrevis

+0

与えられた構造ごとにユーザーがグループにどのように関連しているかあなたはグループごとに1つのmemebrしかないので、複数のメンバーを1つのグループに格納するためのgroup_idとuser_idが存在するテーブルbio_comminity_groups_usersが必要ですこの場合? – sudheshna

答えて

2

は が私たちをみましょう、あまりにもグループユーザ関係テーブルがあるだろうと仮定しますたとえば"groups_members"と入力すると、クエリは次のようになります。

SELECT `posts`.`id`, `posts`.`created_at`, `posts`.`content`, `posts`.`replies`, `groups`.`id` AS `group_id`, `groups`.`name` AS `group_name`, `users`.`name`, `users`.`surname`, `users`.`avatar` 
FROM `posts` 
JOIN `groups` ON (`groups`.`id` = `posts`.`group_id`) 
JOIN `users` ON (`users`.`id` = `posts`.`user_id`) 
WHERE `posts`.`status` = 1 AND `posts`.`post_id` = 0 AND (`posts`.`user_id` = '33' OR `bio_community_posts`.`group_id` IN (SELECT `group_id` FROM `groups_members` WHERE `user_id` =33)) 
ORDER BY `posts`.`id` DESC 
LIMIT 10 
OFFSET 0 

上記のクエリから、ユーザー33が投稿した投稿+ユーザー33がメンバーであるグループの投稿を取得します。

関連する問題