在Yii2中订购两次

时间:2016-06-05 16:34:06

标签: yii2

如何在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。

2 个答案:

答案 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();