[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ORDER BY + GROUP BY
Reverent
Добрый день уважаемые форумчани.

В данный момент пишу форум, и столкнулся с такой проблемой. У меня есть таблица, которая содержит все темы, соответственно есть таблица, которая содержит все сообщения. Мне нужно вывести все темы и последние сообщение к ним.

Примерно таблицы выглядят так.

Для тем:
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 написал(а):
можно так, но не знаю на сколько это оптимально unsure.gif
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)
можно так, но не знаю на сколько это оптимально unsure.gif
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

Хм... выдает ошибку.

Спустя 19 минут, 20 секунд (17.03.2010 - 10:57) Игорь_Vasinsky написал(а):
Может так:


получаешь в массив строчку с последнем добавленным сообщением
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);



запрос работает tongue.gif
А какую ошибку выдаёт?

Спустя 12 минут, 12 секунд (17.03.2010 - 11:15) Игорь_Vasinsky написал(а):
А где таблица с юзерами ? Какие данные ты собрался выводить о пользователе, который добавил последнее сообщение:

как агента ЦРУ - 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)
Цитата (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);



запрос работает tongue.gif
А какую ошибку выдаёт?

У меня не работает этот запрос:

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 запроса подсчитал

Спустя 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 написал(а):
biggrin.gif код легче, id с auto_increment и придумали как иденинтификатор

Спустя 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 написал(а):
коли уж речь идёт сортировки сообщений по последнему написанному, то и надо по дате... blink.gif

Цитата
да это дело твоё...


это дело даже не моё, а Reverent biggrin.gif

Цитата
ты скажи что ты выцепляешь эти запросом...


см. первое сообщение....., что просил автор, то и выцепляю..... cool.gif

Спустя 4 минуты, 12 секунд (17.03.2010 - 11:48) Reverent написал(а):
Цитата (maxims @ 17.03.2010 - 19:36)
Цитата
а по id сортировать не проще (если auto_increment)

а какая разница?

Блин туплю... все правильно, работает... спасибо огромное wink.gif

Спустя 3 минуты, 8 секунд (17.03.2010 - 11:51) Игорь_Vasinsky написал(а):
ну все мы тут друг другу помагаем.

Цитата
коли уж речь идёт сортировки сообщений по последнему написанному, то и надо по дате...


а если по запарке в коде передаётся локальное время ?

Спустя 2 минуты, 11 секунд (17.03.2010 - 11:54) maxims написал(а):
возможно есть более оптимальное решение...... у меня пока моцк не заточен под такие глубокие знания SQL biggrin.gif

Цитата
а если по запарке в коде передаётся локальное время ?

это уже наша с Вами работа, что запарок не было..... wink.gif

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

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


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.