Выберите все категории с последними сообщениями, пользователями и информацией о теме

Я работаю над настраиваемым форумом для веб-проекта. У меня есть категории с 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