Инструменты пользователя

Инструменты сайта


yii:yii2:order_before_group

Сортировка перед группировкой

Бывает необходимо сгруппировать вывод уже после сортировки, так как группировка оставляет только первую похожую запись остальные сворачивает. Если мы используем 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();

подробнее можно посмотреть здесь

yii/yii2/order_before_group.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)