Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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
как вы поняли я пытаюсь вытащить последний пост в данной теме и показать его.
проблема в том что время поста нужное, то есть самое последнее, но при этом автор выдается почему-то первого поста.
В чем моя ошибка?
-
Rodent
покажи структуру таблиц...
-
commander
ты с этим вопросом напоминаешь старого доктора из фильма "Не горюй". У того при любой болезни надо сдавать мочу. Ушибы, переломы - не важно. Сдавай.
И здесь тоже. Ну прочто никак невозможно обойтись без структуры, чтобы сообразить - при группировке кроме агрегатного поля остальные берутся от балды.
-
RomikChef
ты с этим вопросом напоминаешь старого доктора из фильма "Не горюй". У того при любой болезни надо сдавать мочу. Ушибы, переломы - не важно. Сдавай.
:) шутки понял... :)
я даже сильно всматриваться в запрос не стал... поскольку строить догадки по поводу неработоспособности запроса не зная структуру таблиц, на мой взгляд утопично ....
-
Извиняюсь, за столько скорый вопрос без уточнения данных.
Вот структура таблиц
--
-- Структура таблицы `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 ;
Что я пытаюсь сделать...
Это выдащить последний пост для каджого топика.
Что получается...
группируется все по темам, дата полседнего поста, при этом автор первого поста.
-
RomikChef:
при группировке кроме агрегатного поля остальные берутся от балды.
как это от балды? я ведь указал, что группировка по последней дате... я думал, что при этом и автор будет последнего поста, или тут что-то еще не указал...???
-
Rodent:
я думал, что при этом и автор
извини, но мысли улавливать бд еще не научилась
-
commander
думать надо головой.
а не структуру разглядывать.
Все ннужные данные о структуре таблиц вполне можно получить из запроса. Ну, это, впрочем, если способностей хватает.
А если нет - то только структура, да.
Ну, вот она, у тебя есть. Давай, вещай.
-
Rodent
Может обратимся к простым решениям? :)
SELECT MAX(pid) FROM we_posts WHERE forum_id = \'2\'
идея понятна?
RomikChef
Ну, это, впрочем, если способностей хватает.
никто тут твоих способностей не принежает... успокойся... ;)
-
Наверное я все-таки не правильно выражаю свою мысль...
структура таблиц известна...
тем может быть много...
в каждой теме n-количество постов
в каждом количестве есть последний пост
свои запросом, я группирую посты по теме, и темы выдаю которые относятся к данному форуму (т.е. 2)
при этом так же хоелось чтобы выдавалось дата последнего сообщения (поста) и его автор...
Что происходит у меня, все группируется, дата последнего поста выдается, но при этом так же выдается автор первого поста в данной группировке...
Вот я и спрашиваю, как такое возможно... что дата береться последнего поста в данной группировке а автор первого поста..?
Если я что -то упустил в рассмотрении бд просьба объяснить...
-
commander:
никто тут твоих способностей не принежает...
хахаха
оказывается, это о моих способностях идет речь.
утешил :-)))))
Спасибо тебе, родной, ты меня растрогал.
Ну, от личных дел перейдем к общественным.
структура у тебя есть.
Без структуры было отвечать утопично.
Я жду твоих пояснений со структурой.
-
Rodent:
Если я что -то упустил в рассмотрении бд просьба объяснить...
Очевидно, что упустил в описании механизма group by.
А что именно - тебе commander объяснит.
Ведь механизм работы БД зависит от структуры таблиц.
-
RomikChef
оказывается, это о моих способностях идет речь.
утешил :-)))))
Спасибо тебе, родной, ты меня растрогал.
всегда пожалуйста! :)
Очевидно, что упустил в описании механизма group by.
даже если не упускать это "что-то" в описании механизма group by решение всё равно не правильно родное сердце! ;)
В связи с этим структура таблиц нужна! :)
-
так я не спорю. нужна-нужна.
вот она у тебя есть.
давай правильное решение.
-
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
идея понятна? или пояснить?
-
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
-
идея понятна. без вложенных селектов шагу не можем ступить.
впрочем, это тоже очевидно. для того, чтобы сделать нормальный джойн, надо понимать, что такое бд. А это тоже не всем дано.
сочувствую.
-
RomikChef
мне бы хотелось посмотреть твоё решение... коль тебе дана такая чудесная возможность использовать "нормальный джойн" поделись своими соображениями по этому поводу... я думаю всём будет интересно...! :)
P.S. На мой взгляд проще да и понятнее для человека написать решение со вложенными селектами... Возрази...
-
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), а то сейчас начнут копировать без разбирательств... :)
-
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
Вот все пошло, мне просто еще надо было вытаскивать дату и количество постов в данной теме
Огромное спасибо всем.
-
Phoinix
Ну дяденька... Вы наверно космические корабли запускаете...
пока нет... просто искал решение исходя из БД PostgreSQL, MySQL было лень поднимать....
P.S. "Вложенные селекты" - не панацея...
никто не спорит... но вообще хотелось бы немного по подробнее услышать разъяснения относительно не рентабильности использования вложенных селектов. Тесты производительности запросов или что-нить подобное...
-
commander
но вообще хотелось бы немного по подробнее услышать разъяснения относительно не рентабильности использования вложенных селектов.
Если у тебя стоит PostgreSQL - это не значит что он стоит у всех, MySQL поддерживает вложенные селекты с версии 4.1.х, но дело в том, что не у всех провайдеров стоит хотя бы 4.0.х. Поэтомы вопрос рентабильности не стоит. Только лишь - либо можно использовать, либо нельзя.
-
если у него стоит PostgreSQL - это не значит, что в нем нельзя использовать джойн :-)
дискуссия бессмысленна, если цель - не узнать что-то новое, а оправдаться, прикрыть изначальную глупость.
-
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
дискуссия бессмысленна, если цель - не узнать что-то новое, а оправдаться, прикрыть изначальную глупость.
это ты конечно на меня намекаешь?... польщен... :) Что-то от тебя в этом посте я не видел не одного толкового предложения, только флэйм!