У меня есть что-то вроде Facebook Wall build на PHP, который использует базу данных MySQL.
Состав:
Последнее, что есть комментарии. Они хранятся в той же таблице, где находятся сообщения, но с строкой "ответ", установленной для отправки идентификатора, который похож на "родительский".
Вот простой пример:
Food (category):
-> Kebabs (group)
->-> What your fave kebab, folks? (post)
->->-> I love doner kebab! (post too, but displayed as comment)
У меня проблемы при выборе соответствующих должностей. Понимаете, мне нужно отображать сообщения, которые каким-то образом связаны с пользователем.
В настоящее время эти отношения:
Я предполагаю, что это будет один сложный запрос... и мои знания слишком коротки.
Вот запрос:
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;
Предположим, что также будет таблица отношений с группами пользователей. Скажем, "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 является членом.