Как сделать агрегированный запрос внутри группы в MySQL? - PullRequest
1 голос
/ 17 октября 2010

Я пытаюсь получить последние 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');

1 Ответ

1 голос
/ 19 октября 2010

Ну, после долгих попыток и разочарования я наконец понял, что происходит не так. Простая ошибка, на самом деле, я присоединился не к тому полю. Потому что, поскольку я изначально хотел сгруппировать By parent_id, я должен был понять, что именно к parent_id я должен был присоединиться, а не по id. Итак, вот исправленный запрос:

SELECT `Post`.`id`, `Post`.`parent_id`, `Post`.`modified` 
FROM `cake_posts` AS `Post` 
LEFT JOIN `cake_posts` AS `SelfPost` ON
      (`Post`.`parent_id` = `SelfPost`.`parent_id` AND `Post`.`modified` < `SelfPost`.`modified`)
WHERE `SelfPost`.`id` IS NULL 
ORDER BY `Post`.`modified ` DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...