Yii:选择20最后一项按ID排序ASC

我想获得我桌子的最后20个条目,但按升序编号排序。Yii:选择20最后一项按ID排序ASC

在SQL这不是很复杂:

SELECT * 

FROM (SELECT * FROM comments

WHERE postID='$id'

ORDER BY id DESC

LIMIT 20) t

ORDER BY id ASC;

但我想有像我的警予模式,它:

Comment::model()->findAll($criteria) 

但我真的不知道我应该把什么我的CDbCriteria!

回答:

有不使用array_reverse的方式,如果你想使用这个SQL语句:

SELECT * FROM `comments` `t` 

WHERE id

in (SELECT id

FROM (SELECT id FROM comments Where postID = xyz ORDER BY id DESC LIMIT 20)

as q)

ORDER BY id ASC

这标准将变为:

$criteria=new CDbCriteria(); 

$criteria->condition='id in (SELECT id FROM (SELECT id FROM comments Where postID='.$id.' ORDER BY id DESC LIMIT 20) as q)';

$criteria->order='id ASC';

更新:

用你原来的查询,你也可以使用findBySql

$sql='SELECT * FROM (SELECT * FROM comments WHERE postID= :postid ORDER BY id DESC LIMIT 20) q ORDER BY id ASC'; 

$params=array('postid'=>$id);

$comments=Comment::model()->findAllBySql($sql,$params);

该查询的性能比我以前的查询要好。

回答:

$models = Comment::model()->findAll(array(

"condition" => "WHERE postID = '".$id."'",

"order" => "id DESC",

"limit" => 20,

));

将得到最后20个。现在你想要命令该记录由id ASC设置正确吗?难道没有其他领域可以为类似的结果命令由例如(可能是日期或创建场?):

"order" => "id DESC, created ASC" 

废次生排序,但为什么不使用数组逆转?

$models = array_reverse($models); 

回答:

UPD:

请注意,在一般情况下,一些其他的解决方案比我的好。

使用offset会降低查询的性能。 请参阅:http://www.slideshare.net/Eweaver/efficient-pagination-using-mysql和Why does MYSQL higher LIMIT offset slow the query down?

因此,当Comments的数量增加时,可能会导致性能下降。


怎么样使用offset功能?

$model = Comment::model(); 

$condition = 'postID =' . $id;

$limit = 20;

$totalItems = $model->count($condition);

$criteria = new CDbCriteria(array(

'condition' => $condition,

'order' => 'id ASC',

'limit' => $limit,

'offset' => $totalItems - $limit // if offset less, thah 0 - it starts from the beginning

));

$result = $model->findAll($criteria);

以上是 Yii:选择20最后一项按ID排序ASC 的全部内容, 来源链接: utcz.com/qa/259371.html

回到顶部