2009-08-16 3 views
0

В принципе, я пишу небольшой скрипт форума для интрасети.Форум, получить последнее сообщение/тема

У меня есть 3 MySQL (MySQLi) столы для форума:

forum_answer - держит ответы forum_question - занимает первые сообщения forum_categories - имеет название и описание категорий.

Хорошо, поэтому в индексе форума у ​​меня есть таблица для извлечения всех категорий, однако у меня также есть одна колонка, чтобы получить последнее сообщение, сделанное в этой категории/форуме.

У вас есть идеи по поводу того, как я мог получить последнее сообщение, сделанное на этом форуме?

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

Спасибо :)

+0

У вас нет поля даты для каждого сообщения? –

+0

Я делаю, но как бы заказать его для ответа и первого сообщения? – bear

ответ

2

Query-мудры, вы можете получить его с вашим запросом, чтобы получить список категорий, используя что-то похожее на:

select forum_categories.id, forum_categories.name, max(forum_answer.id) as 
from forum_categories 
left join forum_questions on forum_questins.category_id = forum_categories.category_id 
left join forum_answers on forum_answers.question_id = forum_questions.question_id 
group by forum_categories.id, forum_categories.name 

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

Вы также можете найти его полезным, чтобы создать представление, чтобы вытащить свой список категорий из:

create view category_list as 
select forum_categories.id, forum_categories.name, max(forum_answer.id) as latest_asnwer_id 
from forum_categories 
left join forum_questions on forum_questins.category_id = forum_categories.category_id 
left join forum_answers on forum_answers.question_id = forum_questions.question_id 
group by forum_categories.id, forum_categories.name 

Что вы могли бы получить доступ, как если бы это был стол.

+0

Интересно, когда я пытался создать представление, он сделал это только для одной категории. – bear

+0

Ах, имея max (forum_answer.id), берет только последний ответ, который нам не нужен. – bear

+0

Ах, я пренебрег предложением группы. Вам нужно будет группировать все столбцы forum_categories, которые вы включили. Я обновил свой ответ, чтобы быть иллюстративным. –

1

Вы на самом деле думаете в правильном направлении.

Вы обязательно должны «кэшировать» последнее сообщение для вопроса и последнего сообщения для форума и хранить их в своих [forum_question] и [forum_categories] таблицах соответственно. «Кэш» означает обновление их каждый раз, когда кто-то добавляет новое сообщение или удаляет сообщение.

Когда ваша сумма содержания форума достигает определенного порога, прямые расчеты последних сообщений будут ужасно медленными. Обновляя «кеш» каждый раз, когда вы отправляете новое сообщение, вы делите эту огромную одноразовую работу расчета на небольшие обновления, распространяемые на многие запросы и, таким образом, почти незаметные.

Единственный удар, который вы получаете при удалении сообщения, тогда вам нужно обновить кеш для вопроса и форума. Но это редкое событие, поэтому цена может быть предоставлена.

+0

ОК, у меня проблемы с этим:/ – bear

Смежные вопросы