=====Сортировка перед группировкой====
Бывает необходимо сгруппировать вывод уже после сортировки, так как группировка оставляет только первую похожую запись остальные сворачивает.
Если мы используем mysql8.0, то это будет соответствовать запросу который показан ниже:
SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY t.id Desc) row_num ,t.*
FROM `km_communications` t
WHERE (t.`relation_id` IN (14931, 12344, 124334))
AND (t.`relation`='Deals')
ORDER BY t.`id` DESC
) `new_table`
GROUP BY `new_table`.`relation_id`
Если использовать Yii2 То это будет выглядеть подобным образом:
Communications::find()->from([
'new_table' => Communications::find()
->alias('t')
->select([
'ROW_NUMBER() OVER (ORDER BY id DESC) row_num',
't.*'
])
->where(['in', 'relation_id', $ids])
->andWhere(['relation' => (new \ReflectionClass(Deals::className()))->getShortName()])
->orderBy([
'id' => SORT_DESC
])
])->groupBy('new_table.relation_id')->all();
подробнее можно посмотреть [[mysql:when_to_order_before_group|здесь]]