Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Последний пост в топике форума в спике топиков / 7 сообщений из 7, страница 1 из 1
21.12.2005, 15:12:52
    #33449601
Форум
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
Есть минифорум:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
# MySQL-Front Dump  2 . 5 
#
# Host: localhost   Database: test
# --------------------------------------------------------
# Server version  4 . 0 . 18 -max-nt

USE test;


#
# Table structure for table 'forum'
#

DROP TABLE IF EXISTS `forum`;
CREATE TABLE `forum` (
  `frm_id` int( 10 ) unsigned NOT NULL auto_increment,
  `frm_name` varchar( 120 ) NOT NULL default '',
  `frm_site_name` varchar( 64 ) default NULL,
  `frm_descr` text,
  `frm_order` int( 4 ) unsigned NOT NULL default '0',
  PRIMARY KEY  (`frm_id`),
  KEY `frm_site_name_idx` (`frm_site_name`)
) TYPE=MyISAM;



#
# Dumping data for table 'forum'
#

INSERT INTO `forum` (`frm_id`, `frm_name`, `frm_site_name`, `frm_descr`, `frm_order`) VALUES("1", "Форум 1", "forum_1", "Описание форума 1", "1");


#
# Table structure for table 'post'
#

DROP TABLE IF EXISTS `post`;
CREATE TABLE `post` (
  `pst_id` int( 10 ) unsigned NOT NULL auto_increment,
  `tpc_id` int( 10 ) unsigned default NULL,
  `pst_name` varchar( 255 ) default NULL,
  `pst_body` text,
  `pst_date` datetime default NULL,
  `usr_id` int( 10 ) unsigned default NULL,
  `pst_author` varchar( 32 ) default NULL,
  `pst_ip` bigint( 16 ) default NULL,
  PRIMARY KEY  (`pst_id`),
  KEY `usr_id_idx` (`usr_id`),
  KEY `tpc_id_idx` (`tpc_id`)
) TYPE=MyISAM;



#
# Dumping data for table 'post'
#

INSERT INTO `post` (`pst_id`, `tpc_id`, `pst_name`, `pst_body`, `pst_date`, `usr_id`, `pst_author`, `pst_ip`) VALUES("1", "1", NULL, NULL, "2005-11-11 11:11:11", "1", NULL, NULL);
INSERT INTO `post` (`pst_id`, `tpc_id`, `pst_name`, `pst_body`, `pst_date`, `usr_id`, `pst_author`, `pst_ip`) VALUES("2", "1", NULL, NULL, "2005-11-11 11:11:22", "1", NULL, NULL);
INSERT INTO `post` (`pst_id`, `tpc_id`, `pst_name`, `pst_body`, `pst_date`, `usr_id`, `pst_author`, `pst_ip`) VALUES("3", "2", NULL, NULL, "2005-12-12 12:12:12", "1", NULL, NULL);
INSERT INTO `post` (`pst_id`, `tpc_id`, `pst_name`, `pst_body`, `pst_date`, `usr_id`, `pst_author`, `pst_ip`) VALUES("4", "1", NULL, NULL, "2005-12-12 12:12:20", "1", NULL, NULL);


#
# Table structure for table 'topic'
#

DROP TABLE IF EXISTS `topic`;
CREATE TABLE `topic` (
  `tpc_id` int( 10 ) unsigned NOT NULL auto_increment,
  `frm_id` int( 10 ) unsigned NOT NULL default '0',
  `tpc_name` varchar( 255 ) default NULL,
  `tpc_date` datetime default NULL,
  `usr_id` int( 10 ) unsigned default NULL,
  `tpc_usr_name` varchar( 255 ) default NULL,
  `tpc_is_hide` tinyint( 1 ) unsigned default '0',
  `tpc_cnt_view` int( 10 ) unsigned default '1',
  `tpc_cnt_answer` int( 10 ) unsigned default '0',
  `tpc_is_sticky` tinyint( 1 ) unsigned default '0',
  PRIMARY KEY  (`tpc_id`),
  KEY `frm_id_idx` (`frm_id`),
  KEY `usr_id_idx` (`usr_id`)
) TYPE=MyISAM;



#
# Dumping data for table 'topic'
#

INSERT INTO `topic` (`tpc_id`, `frm_id`, `tpc_name`, `tpc_date`, `usr_id`, `tpc_usr_name`, `tpc_is_hide`, `tpc_cnt_view`, `tpc_cnt_answer`, `tpc_is_sticky`) VALUES("1", "1", "Топик 1", "2005-11-11 11:11:11", "1", NULL, "0", "1", "0", "0");
INSERT INTO `topic` (`tpc_id`, `frm_id`, `tpc_name`, `tpc_date`, `usr_id`, `tpc_usr_name`, `tpc_is_hide`, `tpc_cnt_view`, `tpc_cnt_answer`, `tpc_is_sticky`) VALUES("2", "1", "Топик 2", "2005-12-12 12:12:12", "1", NULL, "0", "1", "0", "0");

думаю, как решить вопрос:
при выводе всех топиков чтобы можно было рядом с ними получать еще и дату и автора последнего поста в каждом топике.
Естественно хочется ОДНИМ запросом...
Как это сделать двумя догадываюсь :)
...
Рейтинг: 0 / 0
21.12.2005, 15:21:21
    #33449639
Форум
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
Код: plaintext
1.
2.
3.
4.
5.
SELECT usr.usr_name,frm.frm_name, tpc.*  from port_topic tpc
      inner join port_forum frm on frm.frm_id=tpc.frm_id
      left join users usr on usr.usr_id=tpc.usr_id
      where  1 = 1   AND frm.frm_site_name='dial-up' AND  (tpc_is_hide= 0  or tpc.usr_id= 0 ) 
      order by tpc_is_sticky desc, tpc_date desc
пока есть только вывод топиков и количество постов в каждом топике
...
Рейтинг: 0 / 0
21.12.2005, 15:33:08
    #33449694
Форум
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
Самым простым и эффективным способом мне почему то видится помещение идентификатора последнего поста для каждой записи в таблице топиков.
Может это от незнания.
Небольшая денормализация, зато выигрыш ощутимый...

Вот в MS Access есть функция в SQL-диалекте, которая называется LAST()
Ее не хватает мне для удобства
...
Рейтинг: 0 / 0
21.12.2005, 16:20:38
    #33449862
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
Гм. А ORDER BY field DESC LIMIT 1 эту функцию не заменяет?
...
Рейтинг: 0 / 0
22.12.2005, 12:51:58
    #33451729
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
только если подзапросом: ему ведь надо получить целый список топиков и у каждого по последнему сообщению. Тут действительно нужна денормализация.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
22.12.2005, 14:12:36
    #33452031
Форум
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
В общем сделал кэширование идентификатора последнего поста для темы и форума.
Только при добавлении новой темы или поста они изменяются и директивно для всех форумов и топиков еще в админке обновляется кэш.

Немного денормализовал, но работать стало намного быстрее.

Всем спасибо!
Вопрос решился сам собой!
...
Рейтинг: 0 / 0
22.12.2005, 14:15:59
    #33452040
Форум
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Последний пост в топике форума в спике топиков
Да, кстати забыл сказать еще:
сейчас у меня последний отвеченный топик поднимается в списке тем форума не по дате поста, а по тому самому идентификатору, закэшированному в таблице тем форума.

Ведь все равно чем больше этот идентификатор, тем свежее дата ответа, так?
А обращаться к таблице постов уже не надо.

Тоже послабление для мускула.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Последний пост в топике форума в спике топиков / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]