Forum Webscript.Ru

Общие => Базы данных => Тема начата: Rodent от 27 Декабря 2004, 22:58:23

Название: Не тот результат какой хочу
Отправлено: Rodent от 27 Декабря 2004, 22:58:23
У меня вот такой запрос

SELECT t . * , max( p.date ) AS last, p.author, count( * )
FROM we_topics t
INNER JOIN we_posts p ON t.tid = p.topic_id
WHERE t.forum_id = \'2\'
GROUP BY p.topic_id
ORDER BY last DESC

как вы поняли я пытаюсь вытащить последний пост в данной теме и показать его.
проблема в том что время поста нужное, то есть самое последнее, но при этом автор выдается почему-то первого поста.
В чем моя ошибка?
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 10:30:25
Rodent
покажи структуру таблиц...
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 10:52:03
commander
ты с этим вопросом напоминаешь старого доктора из фильма "Не горюй". У того при любой болезни надо сдавать мочу. Ушибы, переломы - не важно. Сдавай.

И здесь тоже. Ну прочто никак невозможно обойтись без структуры, чтобы сообразить - при группировке кроме агрегатного поля остальные берутся от балды.
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 11:02:15
RomikChef
Цитировать

ты с этим вопросом напоминаешь старого доктора из фильма "Не горюй". У того при любой болезни надо сдавать мочу. Ушибы, переломы - не важно. Сдавай.

:) шутки понял... :)

я даже сильно всматриваться в запрос не стал... поскольку строить догадки по поводу неработоспособности запроса не зная структуру таблиц, на мой взгляд утопично ....
Название: Не тот результат какой хочу
Отправлено: Rodent от 28 Декабря 2004, 13:04:39
Извиняюсь, за столько скорый вопрос без уточнения данных.
Вот структура таблиц

--
-- Структура таблицы `we_topics`
--

CREATE TABLE `we_topics` (
  `forum_id` smallint(5) default NULL,
  `tid` int(10) NOT NULL auto_increment,
  `title` varchar(100) default NULL,
  `descr` varchar(100) default NULL,
  `state` tinyint(1) NOT NULL default \'0\',
  PRIMARY KEY  (`tid`),
  UNIQUE KEY `id_topic` (`tid`)
) TYPE=MyISAM AUTO_INCREMENT=92 ;

--
-- Структура таблицы `we_posts`
--

CREATE TABLE `we_posts` (
  `forum_id` smallint(5) NOT NULL default \'0\',
  `topic_id` int(10) NOT NULL default \'0\',
  `pid` int(10) NOT NULL auto_increment,
  `text` text,
  `author` varchar(30) default NULL,
  `date` varchar(12) default NULL,
  `ip` varchar(15) default NULL,
  `edit_name` varchar(30) default NULL,
  `edit_date` varchar(12) default NULL,
  PRIMARY KEY  (`pid`),
  UNIQUE KEY `id_post` (`pid`)
) TYPE=MyISAM AUTO_INCREMENT=221 ;

Что я пытаюсь сделать...
Это выдащить последний пост для каджого топика.
Что получается...
группируется все по темам, дата полседнего поста, при этом автор первого поста.
Название: Не тот результат какой хочу
Отправлено: Rodent от 28 Декабря 2004, 13:07:16
Цитировать
RomikChef:
при группировке кроме агрегатного поля остальные берутся от балды.

как это от балды? я ведь указал, что группировка по последней дате... я думал, что при этом и автор будет последнего поста, или тут что-то еще не указал...???
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 14:38:03
Цитировать
Rodent:
я думал, что при этом и автор

извини, но мысли улавливать бд еще не научилась
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 14:45:46
commander
думать надо головой.
а не структуру разглядывать.

Все ннужные данные о структуре таблиц вполне можно получить из запроса. Ну, это, впрочем, если способностей хватает.
А если нет - то только структура, да.
Ну, вот она, у тебя есть. Давай, вещай.
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 15:06:53
Rodent
Может обратимся к простым решениям? :)
SELECT MAX(pid) FROM we_posts WHERE forum_id = \'2\'
идея понятна?

RomikChef
Цитировать
Ну, это, впрочем, если способностей хватает.

никто тут твоих способностей не принежает... успокойся... ;)
Название: Не тот результат какой хочу
Отправлено: Rodent от 28 Декабря 2004, 15:24:37
Наверное я все-таки не правильно выражаю свою мысль...
структура таблиц известна...
тем может быть много...
в каждой теме n-количество постов
в каждом количестве есть последний пост
свои запросом, я группирую посты по теме, и темы выдаю которые относятся к данному форуму (т.е. 2)
при этом так же хоелось чтобы выдавалось дата последнего сообщения (поста) и его автор...
Что происходит у меня, все группируется, дата последнего поста выдается, но при этом так же выдается автор первого поста в данной группировке...
Вот я и спрашиваю, как такое возможно... что дата береться последнего поста в данной группировке а автор первого поста..?
Если я что -то упустил в рассмотрении бд просьба объяснить...
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 16:03:47
Цитировать
commander:
никто тут твоих способностей не принежает...

хахаха
оказывается, это о моих способностях идет речь.
утешил :-)))))
Спасибо тебе, родной, ты меня растрогал.
Ну, от личных дел перейдем к общественным.
структура у тебя есть.
Без структуры было отвечать утопично.
Я жду твоих пояснений со структурой.
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 16:06:54
Цитировать
Rodent:
Если я что -то упустил в рассмотрении бд просьба объяснить...

Очевидно, что упустил в описании механизма group by.
А что именно - тебе commander объяснит.
Ведь механизм работы БД зависит от структуры таблиц.
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 16:55:22
RomikChef
Цитировать
оказывается, это о моих способностях идет речь.
утешил :-)))))
Спасибо тебе, родной, ты меня растрогал.

всегда пожалуйста! :)

Цитировать
Очевидно, что упустил в описании механизма group by.

даже если не упускать это "что-то" в описании механизма group by решение всё равно не правильно родное сердце! ;)

В связи с этим структура таблиц нужна! :)
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 17:14:04
так я не спорю. нужна-нужна.
вот она у тебя есть.
давай правильное решение.
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 17:31:02
Rodent
SELECT DISTINCT t.*, (SELECT MAX(date) FROM we_posts WHERE topic_id=t.tid) AS date,
(SELECT author FROM we_posts WHERE topic_id=t.tid AND date=(SELECT MAX(date) FROM we_posts WHERE topic_id=t.tid)) AS author
FROM we_posts p, we_topics t WHERE t.tid=p.topic_id

идея понятна? или пояснить?
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 17:45:20
Rodent
хотя на колонку date опираться в этом случае конечно можно, когда дело касаеться банального форума... а вообще более правильный вариант будет таким, как я уже писал:
Цитировать
SELECT MAX(pid) FROM we_posts WHERE forum_id = \'2\'
идея понятна?

лучше опираться на id, из чего следует следующее... :
SELECT DISTINCT t.*, (SELECT date FROM we_posts WHERE topic_id=t.tid AND pid=(SELECT MAX(pid) FROM we_posts WHERE topic_id=t.tid)) AS date, (SELECT author FROM we_posts WHERE topic_id=t.tid AND pid=(SELECT MAX(pid) FROM we_posts WHERE topic_id=t.tid)) AS author FROM we_posts p, we_topics t WHERE t.tid=p.topic_id AND p.forum_id=1
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 28 Декабря 2004, 18:13:32
идея понятна. без вложенных селектов шагу не можем ступить.
впрочем, это тоже очевидно. для того, чтобы сделать нормальный джойн, надо понимать, что такое бд. А это тоже не всем дано.
сочувствую.
Название: Не тот результат какой хочу
Отправлено: commander от 28 Декабря 2004, 18:22:36
RomikChef
мне бы хотелось посмотреть твоё решение... коль тебе дана такая чудесная возможность использовать "нормальный джойн" поделись своими соображениями по этому поводу... я думаю всём будет интересно...! :)

P.S. На мой взгляд проще да и понятнее для человека написать решение со вложенными селектами... Возрази...
Название: Не тот результат какой хочу
Отправлено: Phoinix от 28 Декабря 2004, 18:38:47
commander

Ну дяденька... Вы наверно космические корабли запускаете... :).

Все гораздо проще...

SELECT
MAX(t2.pid) AS older, t3.*
FROM `we_topics` AS t1, `we_posts` AS t2 , `we_posts` AS t3
WHERE t1.forum_id = \'1\' AND t1.tid = t2.topic_id
GROUP BY t1.tid, t3.pid
HAVING t3.pid = older

И все... ;)

P.S. "Вложенные селекты" - не панацея...

P.P.S. Ой опечатался в MAX(t2.pid), а то сейчас начнут копировать без разбирательств... :)
Название: Не тот результат какой хочу
Отправлено: Rodent от 28 Декабря 2004, 19:02:00
SELECT t1 . * , max( t2.date ) AS last, MAX( t2.pid ) AS older, t3 . *, count(*)
FROM `we_topics` AS t1, `we_posts` AS t2, `we_posts` AS t3
WHERE t1.forum_id = \'2\'
AND t1.tid = t2.topic_id
GROUP BY t1.tid, t3.pid
HAVING t3.pid = older
ORDER BY last DESC

Вот все пошло, мне просто еще надо было вытаскивать дату и количество постов в данной теме

Огромное спасибо всем.
Название: Не тот результат какой хочу
Отправлено: commander от 29 Декабря 2004, 10:26:33
Phoinix
Цитировать
Ну дяденька... Вы наверно космические корабли запускаете...

пока нет... просто искал решение исходя из БД PostgreSQL, MySQL было лень поднимать....
Цитировать
P.S. "Вложенные селекты" - не панацея...

никто не спорит... но вообще хотелось бы немного по подробнее услышать разъяснения относительно не рентабильности использования вложенных селектов. Тесты производительности запросов или что-нить подобное...
Название: Не тот результат какой хочу
Отправлено: Phoinix от 29 Декабря 2004, 13:42:14
commander

Цитировать
но вообще хотелось бы немного по подробнее услышать разъяснения относительно не рентабильности использования вложенных селектов.


Если у тебя стоит PostgreSQL - это не значит что он стоит у всех, MySQL поддерживает вложенные селекты с версии 4.1.х, но дело в том, что не у всех провайдеров стоит хотя бы 4.0.х. Поэтомы вопрос рентабильности не стоит. Только лишь - либо можно использовать, либо нельзя.
Название: Не тот результат какой хочу
Отправлено: Меняздесьдавнонет от 29 Декабря 2004, 13:51:10
если у него стоит PostgreSQL - это не значит, что в нем нельзя использовать джойн :-)
дискуссия бессмысленна, если цель - не узнать что-то новое, а оправдаться, прикрыть изначальную глупость.
Название: Не тот результат какой хочу
Отправлено: commander от 29 Декабря 2004, 13:58:59
RomikChef
Цитировать

если у него стоит PostgreSQL - это не значит, что в нем нельзя использовать джойн :-)

попробуй на досуге в постгре такой запрос:
SELECT t1 . * , max( t2.date ) AS last, MAX( t2.pid ) AS older, t3 . *, count(*)
FROM `we_topics` AS t1, `we_posts` AS t2, `we_posts` AS t3
WHERE t1.forum_id = \'2\'
AND t1.tid = t2.topic_id
GROUP BY t1.tid, t3.pid
HAVING t3.pid = older
ORDER BY last DESC


Цитировать
дискуссия бессмысленна, если цель - не узнать что-то новое, а оправдаться, прикрыть изначальную глупость.

это ты конечно на меня намекаешь?... польщен... :)  Что-то от тебя в этом посте я не видел не одного толкового предложения, только флэйм!