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

Я работаю над настраиваемым форумом для веб-проекта. У меня есть категории с идентификатором, темы с идентификатором и категорией, а также сообщения с идентификатором и темой и идентификатором пользователя. То, что я пытаюсь сделать, это отобразить список категорий с данными из таблицы категорий, а также данные из таблицы сообщений для самого нового сообщения в этой категории, данные для ассоциированного пользователя этих сообщений, а также некоторые данные для темы. связано с этим последним постом.

Я бился головой об стену, пытаясь понять запрос, но у меня просто недостаточно понимания сложных запросов 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, а в разделе «Последние» — данные о пользователе, сообщении и теме для последнего сообщения:

На выходе я'm trying to achieve

Пожалуйста, помогите мне. Спасибо.

2

Решение

Хотя достаточно просто объединить все таблицы, чтобы проработать тему, категорию и пользователя для каждого сообщения, вам также необходимо выполнить еще один дополнительный шаг — вам нужно присоединиться к подзапросу, который извлекает 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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]