В данный момент пишу форум, и столкнулся с такой проблемой. У меня есть таблица, которая содержит все темы, соответственно есть таблица, которая содержит все сообщения. Мне нужно вывести все темы и последние сообщение к ним.
Примерно таблицы выглядят так.
Для тем:
CREATE TABLE forumThemes
(
id_forumThemes MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
id_users MEDIUMINT(8) UNSIGNED NOT NULL,
header VARCHAR(100) NOT NULL,
shows MEDIUMINT(8) UNSIGNED,
PRIMARY KEY(id_forumThemes),
INDEX(id_users)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Для сообщений
CREATE TABLE forumMessages
(
id_forumMessages MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
id_forumThemes MEDIUMINT(8) UNSIGNED NOT NULL,
id_users MEDIUMINT(8) UNSIGNED NOT NULL,
message TEXT(5000) NOT NULL,
dateAndTimeAdd DATETIME NOT NULL,
picture MEDIUMBLOB,
picture_format VARCHAR(255),
PRIMARY KEY(id_forumMessages),
INDEX(id_forumThemes),
INDEX(id_users)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Я пишу такую конструкцию:
SELECT
forumThemes.header,
forumMessages.id_users,
forumMessages.dateAndTimeAdd
FROM
forumThemes,
forumMessages
WHERE
forumThemes.id_forumThemes = forumMessages.id_forumThemes
GROUP BY forumMessages.id_forumThemes
ORDER BY forumMessages.dateAndTimeAdd DESC;
Но он мне как назло выдает дату не последние сообщение, и не id пользователя который написал последние сообщение, а просто какие-то левые данные. Чувствую возникает сложность в сортировке скомпонованных данных конструкцией GROUP BY. Что мне делать, как по другому написать запрос, что бы получить дату и id пользователя написавшего последние сообщение?
Спустя 2 часа, 13 минут, 54 секунды (17.03.2010 - 10:31) maxims написал(а):
можно так, но не знаю на сколько это оптимально

SELECT r.* FROM (SELECT
t.header,
m.id_users,
m.dateAndTimeAdd
FROM
forumThemes t,
forumMessages m
WHERE
t.id_forumThemes = m.id_forumThemes
ORDER BY m.dateAndTimeAdd DESC) r GROUP BY 1 ORDER BY 3 DESC
Спустя 6 минут, 44 секунды (17.03.2010 - 10:38) Reverent написал(а):
Цитата (maxims @ 17.03.2010 - 18:31) |
можно так, но не знаю на сколько это оптимально ![]() SELECT r.* FROM (SELECT |
Хм... выдает ошибку.
Спустя 19 минут, 20 секунд (17.03.2010 - 10:57) Игорь_Vasinsky написал(а):
Может так:
получаешь в массив строчку с последнем добавленным сообщением
вытаскиваешь из массива id_users
.. а таблицу с даннымы о usere я у тебя не вижу...
потом из таблицы с usera-ми по id вытаскиваешь в массив всю строчку пользователя
получаешь в массив строчку с последнем добавленным сообщением
SELECT * FROM `forumMessages` ORDER by `id` DESC LIMIT 1
вытаскиваешь из массива id_users
.. а таблицу с даннымы о usere я у тебя не вижу...
потом из таблицы с usera-ми по id вытаскиваешь в массив всю строчку пользователя
SELECT * FROM `users` WHERE `id`='id_users'
Спустя 5 минут, 59 секунд (17.03.2010 - 11:03) maxims написал(а):
Цитата (Reverent @ 17.03.2010 - 07:38) |
Хм... выдает ошибку. |
может дело в настройках мускула?
для
--
-- Структура таблицы `forumMessages`
--
CREATE TABLE `forumMessages` (
`id_forumMessages` mediumint(8) unsigned NOT NULL auto_increment,
`id_forumThemes` mediumint(8) unsigned NOT NULL,
`id_users` mediumint(8) unsigned NOT NULL,
`message` text NOT NULL,
`dateAndTimeAdd` datetime NOT NULL,
`picture` mediumblob,
`picture_format` varchar(255) default NULL,
PRIMARY KEY (`id_forumMessages`),
KEY `id_forumThemes` (`id_forumThemes`),
KEY `id_users` (`id_users`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;
--
-- Дамп данных таблицы `forumMessages`
--
INSERT INTO `forumMessages` VALUES (1, 1, 2, 'павпап', '2010-03-17 13:58:19', '', NULL);
INSERT INTO `forumMessages` VALUES (2, 2, 1, 'тпаравпва', '2010-03-18 13:59:04', '', NULL);
INSERT INTO `forumMessages` VALUES (3, 2, 2, 'рннереноео', '2010-03-20 13:59:14', '', NULL);
-- --------------------------------------------------------
--
-- Структура таблицы `forumThemes`
--
CREATE TABLE `forumThemes` (
`id_forumThemes` mediumint(8) unsigned NOT NULL auto_increment,
`id_users` mediumint(8) unsigned NOT NULL,
`header` varchar(100) NOT NULL,
`shows` mediumint(8) unsigned default NULL,
PRIMARY KEY (`id_forumThemes`),
KEY `id_users` (`id_users`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
--
-- Дамп данных таблицы `forumThemes`
--
INSERT INTO `forumThemes` VALUES (1, 1, 'название темы 1', NULL);
INSERT INTO `forumThemes` VALUES (2, 1, 'название темы 2', NULL);
INSERT INTO `forumThemes` VALUES (3, 2, 'название темы 3', NULL);
INSERT INTO `forumThemes` VALUES (4, 2, 'название темы 4', NULL);
запрос работает

А какую ошибку выдаёт?
Спустя 12 минут, 12 секунд (17.03.2010 - 11:15) Игорь_Vasinsky написал(а):
А где таблица с юзерами ? Какие данные ты собрался выводить о пользователе, который добавил последнее сообщение:
как агента ЦРУ - ID=234
я привёл пример для юзера оставившего самое последнее сообщение на форуме, а не какой то определённой темы
как агента ЦРУ - ID=234
я привёл пример для юзера оставившего самое последнее сообщение на форуме, а не какой то определённой темы
Спустя 2 минуты, 56 секунд (17.03.2010 - 11:18) Игорь_Vasinsky написал(а):
Цитата |
`picture` mediumblob, |
я давно не храню картинки в базе:
а на выводе
$pic_for_base = str_replace(".gif", "", $pig)- оставил тока имя
а на выводе
<img src='".$pic_from_base.".gif'>
Спустя 8 минут, 35 секунд (17.03.2010 - 11:27) Reverent написал(а):
Цитата (maxims @ 17.03.2010 - 19:03) | ||
может дело в настройках мускула? для
запрос работает ![]() А какую ошибку выдаёт? |
У меня не работает этот запрос:
SELECT r.* FROM (SELECT
t.header,
m.id_users,
m.dateAndTimeAdd
FROM
forumThemes t,
forumMessages m
WHERE
t.id_forumThemes = m.id_forumThemes
ORDER BY m.dateAndTimeAdd DESC) r GROUP BY 1 ORDER BY 3 DESC
Спустя 1 минута, 50 секунд (17.03.2010 - 11:29) Reverent написал(а):
Цитата (Игорь_Vasinsky @ 17.03.2010 - 19:15) |
А где таблица с юзерами ? Какие данные ты собрался выводить о пользователе, который добавил последнее сообщение: как агента ЦРУ - ID=234 я привёл пример для юзера оставившего самое последнее сообщение на форуме, а не какой то определённой темы |
Вы понимаете какую нагрузку вы создадите на сервер при таких запросах, а если тем будет 100 штук и пользователей 1000, мне придется сделать 1000 запросов к базе что бы все это достать, не думаю что такой вариант оптимален.
Спустя 1 минута, 36 секунд (17.03.2010 - 11:30) Игорь_Vasinsky написал(а):
слушай не не мостак такие запросы разбирать, я пишу по старинке
без префиксоф и т.д.
Какие 1000 запросов когда вы вытащили нужный вам 1 id ..
и по нему вычислили юзера - я тока 2 запроса подсчитал
без префиксоф и т.д.
Какие 1000 запросов когда вы вытащили нужный вам 1 id ..
и по нему вычислили юзера - я тока 2 запроса подсчитал
Спустя 45 секунд (17.03.2010 - 11:31) maxims написал(а):
Цитата |
У меня не работает этот запрос: SELECT r.* FROM (SELECT t.header, m.id_users, m.dateAndTimeAdd FROM forumThemes t, forumMessages m WHERE t.id_forumThemes = m.id_forumThemes ORDER BY m.dateAndTimeAdd DESC) r GROUP BY 1 ORDER BY 3 DESC |
что пишет то? какай ошибка? или просто "типа по данному запросу ничего не найдено"?
Спустя 1 минута, 31 секунда (17.03.2010 - 11:32) Игорь_Vasinsky написал(а):
Цитата |
ORDER BY m.dateAndTimeAdd DESC |
а по id сортировать не проще (если auto_increment)
Спустя 3 минуты, 7 секунд (17.03.2010 - 11:36) maxims написал(а):
Цитата |
а по id сортировать не проще (если auto_increment) |
а какая разница?
Спустя 1 минута, 15 секунд (17.03.2010 - 11:37) Игорь_Vasinsky написал(а):

Спустя 1 минута, 44 секунды (17.03.2010 - 11:39) Игорь_Vasinsky написал(а):
да это дело твоё...
ты скажи что ты выцепляешь эти запросом...
SELECT r.* FROM (SELECT
t.header,
m.id_users,
m.dateAndTimeAdd
FROM
forumThemes t,
forumMessages m
WHERE
t.id_forumThemes = m.id_forumThemes
ORDER BY m.dateAndTimeAdd DESC) r GROUP BY 1 ORDER BY 3 DESC
ты скажи что ты выцепляешь эти запросом...
Спустя 5 минут, 32 секунды (17.03.2010 - 11:44) maxims написал(а):
коли уж речь идёт сортировки сообщений по последнему написанному, то и надо по дате...

Цитата |
да это дело твоё... |
это дело даже не моё, а Reverent

Цитата |
ты скажи что ты выцепляешь эти запросом... |
см. первое сообщение....., что просил автор, то и выцепляю.....

Спустя 4 минуты, 12 секунд (17.03.2010 - 11:48) Reverent написал(а):
Цитата (maxims @ 17.03.2010 - 19:36) | ||
а какая разница? |
Блин туплю... все правильно, работает... спасибо огромное

Спустя 3 минуты, 8 секунд (17.03.2010 - 11:51) Игорь_Vasinsky написал(а):
ну все мы тут друг другу помагаем.
Цитата |
коли уж речь идёт сортировки сообщений по последнему написанному, то и надо по дате... |
а если по запарке в коде передаётся локальное время ?
Спустя 2 минуты, 11 секунд (17.03.2010 - 11:54) maxims написал(а):
возможно есть более оптимальное решение...... у меня пока моцк не заточен под такие глубокие знания SQL

Цитата |
а если по запарке в коде передаётся локальное время ? |
это уже наша с Вами работа, что запарок не было.....

Спустя 1 минута, 20 секунд (17.03.2010 - 11:55) Игорь_Vasinsky написал(а):

Спустя 14 часов, 47 минут, 54 секунды (18.03.2010 - 02:43) Reverent написал(а):
Всем огромное спасибо, особенно maxims!
_____________