Я пытаюсь получить последние modified
"сообщений" из группы "сообщений", которые имеют одинаковые parent_id
.Сегодня я уже узнал, что группировка - это не ответ, и что мне следует либо использовать внутренний подзапрос, либо «агрегат внутри группы», благодаря этому сайту >> Агрегатам >> Агрегатам внутри группы.Я выбрал последнюю версию, так как она мне приятнее, проще в реализации, учитывая, что я использую CakePHP, и, как говорят, быстрее (вы можете подтвердить?)
Поэтому я пришел к следующему запросу:
SELECT `Post`.`id`, `Post`.`parent_id`, `Post`.`modified`
FROM `cake_posts` AS `Post`
LEFT JOIN `cake_posts` AS `SelfPost` ON
(`Post`.`id` = `SelfPost`.`id` AND `Post`.`modified` < `SelfPost`.`modified`)
WHERE `SelfPost`.`id` IS NULL
ORDER BY `Post`.`parent_id` ASC
Но вот результат:
|-----------------------------------|
| id |parent_id| modified |
|-----------------------------------|
| 1 | 1 |2010-10-16 17:04:43 |
| 3 | 1 |2010-10-16 20:04:53 |
| 6 | 2 |2010-10-16 21:46:59 |
| 5 | 2 |2010-10-16 21:46:44 |
| 2 | 2 |2010-10-16 17:06:10 |
| 4 | 4 |2010-10-16 21:46:19 |
| 7 | 7 |2010-10-16 22:03:19 |
| 8 | 8 |2010-10-16 22:03:25 |
| 9 | 9 |2010-10-16 22:03:32 |
| 10 | 10 |2010-10-17 00:18:10 |
| 11 | 11 |2010-10-17 00:18:15 |
И, как вы видите, у меня все еще есть дубликаты parent_id
, так что я делаю не так?
РЕДАКТИРОВАТЬ: По сути это форум очень легкий, темы и сообщения хранятся в одной таблице.Таким образом, каждый пост (он же сообщение, он же строка в таблице) либо имеет своего родителя, либо самого себя как родителя (но я не думаю, что это актуально на данный момент).Я пытаюсь создать индекс, поэтому для каждой темы (например, сообщения с одинаковыми parent_id
) я хочу только последнее измененное сообщение.Я хотел бы получить:
|-----------------------------------|
| id |parent_id| modified |
|-----------------------------------|
| | - | |
| 3 | 1 |2010-10-16 20:04:53 |
| 6 | 2 |2010-10-16 21:46:59 |
| | - | |
| | - | |
| 4 | 4 |2010-10-16 21:46:19 |
| 7 | 7 |2010-10-16 22:03:19 |
| 8 | 8 |2010-10-16 22:03:25 |
| 9 | 9 |2010-10-16 22:03:32 |
| 10 | 10 |2010-10-17 00:18:10 |
| 11 | 11 |2010-10-17 00:18:15 |
Дополнительные данные:
CREATE TABLE IF NOT EXISTS `cake_posts` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(11) unsigned NOT NULL DEFAULT '0',
`modified` datetime NOT NULL,
PRIMARY KEY (`id`, `parent_id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Posts to topics' AUTO_INCREMENT=12 ;
INSERT INTO `cake_posts` (`id`, `parent_id`, `modified`) VALUES
(1, 1, '2010-10-16 17:04:43'),
(3, 1, '2010-10-16 20:04:53'),
(6, 2, '2010-10-16 21:46:59'),
(5, 2, '2010-10-16 21:46:44'),
(2, 2, '2010-10-16 17:06:10'),
(4, 4, '2010-10-16 21:46:19'),
(7, 7, '2010-10-16 22:03:19'),
(8, 8, '2010-10-16 22:03:25'),
(9, 9, '2010-10-16 22:03:32'),
(10, 10, '2010-10-17 00:18:10'),
(11, 11, '2010-10-17 00:18:15');