我想得到我表格的最后20个条目,但按升序排序。
在Sql中它不是很复杂:
SELECT *
FROM (SELECT * FROM comments
WHERE postID='$id'
ORDER BY id DESC
LIMIT 20) t
ORDER BY id ASC;
但我想用我的yii模型来表达:
Comment::model()->findAll($criteria)
但我真的不知道我应该把什么放在我的CDbCriteria中!
答案 0 :(得分:10)
$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);
答案 1 :(得分:4)
如果你想使用这个sql,有一种不使用array_reverse
的方法:
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);
此查询的效果优于我之前的查询。
答案 2 :(得分:2)
<强> 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);