如何在yii2中按同一列排序两次?
select * from (
select * from your_table order by id desc limit 20)
tmp order by tmp.id asc
为什么我需要排序两次? 我有事件表。我想显示eventDate比今天大的事件然后使用asc对其进行排序。
$events = Events::find()->where(['>=', 'eventDate', $today])->andWhere(['status' => 1])->orderBy(['eventDate' => SORT_ASC])->limit(5)->all();
因为我想显示至少5个事件,如果上面的查询结果小于5,我需要找到eventDate比今天小的所有事件,并按降序排序,但我想用它来显示它升序。
if(count($events)<4){
$need = 4 - count($events);
$pastEvents = Events::find()->where(['<', 'eventDate', $today])->andWhere(['status' => 1])->orderBy(['eventDate' => SORT_DESC])->limit($need)->all();
}
例如:今天是6月6日。 6月1日,2日,3日,4日,5日,7日和8日举办活动。首先,我得到的结果是第7和第8。因为事件仍然是2,我想再获得3个与今天最近的日期。因此,eventDate比今天小,我得到第1,第2,第3,第4和第5。然后我需要使用降序对其进行排序,并将其限制为3以获得第3,第4和第5。因为它使用降序,我得到第5,第4和第3。但我希望最终结果成为第3,第4,第5,第7和第8。
答案 0 :(得分:2)
您正在使用子查询,因此您可以使用您用于简单查询的所有内容。
$subQuery = (new Query())->select('id')->from('user')->where('status=1')->orderBy('id');
$query->from(['u' => $subQuery])->orderBy('u.id');
答案 1 :(得分:1)
一种简单的方法是使用findBySql
$sql = "select * from (
select * from your_table order by id desc limit 20)
tmp
order by tmp.id asc"
YourTableOrderMOdel::findBySql()->count( $sql)->all();