GROUP BY и сортировка

ufolog

Новичок
Есть запрос :
PHP:
SELECT SQL_CALC_FOUND_ROWS `topic_assignments`.`model`, `comments`.`created_date` , `topic`.`id`
FROM `topic_assignments` 
JOIN `topics` AS `topic` 
ON `topic_assignments`.`topic_id` = `topic`.`id`
LEFT JOIN `topic_assignment_comments` AS `comments` 
ON `topic_assignments`.`id` = `comments`.`topic_assignment_id`

WHERE
    `topic_assignments`.`active` = '1'
   GROUP BY `topic`.`id`
ORDER BY 
    `comments`.`created_date` DESC  
LIMIT 10
выдает результат
`topic`.`id` `comments`.`created_date`
1 1314710487
2 1314710960

без GROUP BY выдает :

`topic`.`id` `comments`.`created_date`
2 1314780805
1 1314780710
2 1314710960
1 1314710487

Задача такова: отсортировать топики по дате добавления комментария в топик

результат без группировки сортирует правильно а с группировкой игнорирует сортировку

возможно ли каким либо образом повлиять на группировку что бы данные выводились корректные ?
Может кто-нибудь сталкивался с подобным поведением.
 

MiksIr

miksir@home:~$
Поведение вполне логичное и проистекает от того, что нужно оторвать руки тем, кто использует в селекте не агрегированные поля вместе с групировкой. И в первую очередь оторвать мускулю за то, что позволяет это делать.
SELECT ... MAX(`comments`.`created_date`) as `max_date` ... ORDER BY max_date
Или попробовать лефт-джойнить сразу по подзапросу с групировкой. Нужно посмотреть explain.
А лучше тут денормализовать и хранить дату последнего коммента в topic_assignments или topics
 

MiksIr

miksir@home:~$
Или выключить эту "фичу".
Ага, надеюсь рано или поздно такое поведение будет by default.

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

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Ага, надеюсь рано или поздно такое поведение будет by default.

К слову есть один случай, когда такое использование оправдано - группировка по праймари ключу (для агрегации присоединенных таблиц).
Это решается отслеживанием наличия первичного ключа в списке:
Allow non-GROUP BY columns in the query target list when the primary key is specified in the GROUP BY clause (Peter Eisentraut)

Some other database system already allowed this behavior, and because of the primary key, the result is unambiguous.
а не разрешением использовать вообще любые негруппированые поля, где результат непредсказуем...
 

MiksIr

miksir@home:~$
А кто бы спорил. Рад, что pg ввел эту фичу, ибо альтернативы (подзапросы) решению таких проблем получались весьма некрасивые.
 
Сверху