Я работаю над настраиваемым форумом для веб-проекта. У меня есть категории с id, темы с идентификатором и категорией, а также сообщения с идентификатором и темой и идентификатором пользователя. То, что я пытаюсь сделать, это отобразить список категорий с данными из таблицы категорий, а также данные из таблицы сообщений для самой новой записи в этой категории, данные для связанного с ней пользователя, а также некоторые данные для этой темы связанные с этим последним сообщением.
Я стучал головой о стену, пытаясь понять вопрос, но я просто недостаточно хорошо разбираюсь в сложных запросах mysql, чтобы узнать, какой шаблон или метод использовать здесь. Вот что я имею до сих пор:
SELECT u1.*, fp1.*, ft1.*, fc1.* from forum_posts AS fp1 LEFT JOIN users AS u1 ON u1.id = fp1.post_by LEFT JOIN forum_topics AS ft1 on ft1.id = fp1.post_topic LEFT JOIN forum_categories AS fc1 on fc1.id = ft1.topic_cat GROUP BY fc1.id ORDER BY fp1.id ASC;
Но это не возвращает результаты, которые я ищу. Проблема заключается в попытке получить самую новую запись для каждой категории и ассоциированной темы для этой публикации.
Вот структура БД для каждой таблицы:
forum_categories
+-----------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | cat_name | varchar(255) | NO | UNI | NULL | | | cat_description | varchar(500) | NO | | NULL | | | cat_views | bigint(20) unsigned | YES | | 0 | | | status | tinyint(1) | NO | | 1 | | +-----------------+---------------------+------+-----+---------+----------------+
forum_topics
+---------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | topic_subject | varchar(255) | NO | | NULL | | | topic_date | datetime | NO | | NULL | | | topic_cat | bigint(20) unsigned | NO | MUL | NULL | | | topic_by | bigint(20) unsigned | NO | MUL | NULL | | | topic_views | bigint(20) unsigned | YES | | 0 | | +---------------+---------------------+------+-----+---------+----------------+
forum_posts
+--------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | post_content | text | NO | | NULL | | | post_date | datetime | NO | | NULL | | | post_topic | bigint(20) unsigned | NO | MUL | NULL | | | post_by | bigint(20) unsigned | NO | MUL | NULL | | +--------------+---------------------+------+-----+---------+----------------+
пользователи
+-----------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | user_type | varchar(50) | YES | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | username | varchar(255) | YES | UNI | NULL | | | password | char(60) | NO | | NULL | | | image | text | YES | | NULL | | | status | tinyint(1) | NO | | 1 | | +-----------+---------------------+------+-----+---------+----------------+
Вот изображение выхода, которого я пытаюсь достичь. «Категории» отображает данные из таблицы forum_categories, а в разделе «Недавние» – данные пользователя, сообщения и темы для последнего сообщения:
Пожалуйста, помогите мне. Спасибо.
Хотя достаточно просто объединить все таблицы вместе, чтобы выработать тему, категорию и пользователя для каждого сообщения, вам также нужен еще один шаг – вам нужно присоединиться к подзапросу, который извлекает max(post_id)
каждой категории.
Вот один из способов сделать это:
select fc.cat_name, fc.cat_description, fc.cat_views, u.username, fp.post_date, ft.topic_subject from forum_categories fc inner join forum_topics ft on fc.id = ft.topic_cat inner join forum_posts fp on fp.post_topic = ft.id inner join users u on fp.post_by = u.id inner join ( select topic_cat, max(fp.id) most_recent_post from forum_topics ft inner join forum_posts fp on fp.post_topic = ft.id group by topic_cat ) q on q.topic_cat = ft.topic_cat and fp.id = q.most_recent_post;
Здесь есть демо-версия: http://sqlfiddle.com/#!9/3736b/1