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