Php Yii:按id ASC选择20个最后条目订单

Php Yii:按id ASC选择20个最后条目订单,php,mysql,sql,activerecord,yii,Php,Mysql,Sql,Activerecord,Yii,我想得到我的表的最后20个条目,但按id升序排列 在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) 但我真的不知道我应该在我的CDBC标准中加入什么

我想得到我的表的最后20个条目,但按id升序排列

在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)
但我真的不知道我应该在我的CDBC标准中加入什么

$models = Comment::model()->findAll(array(
    "condition" => "WHERE postID = '".$id."'",
    "order" => "id DESC",
    "limit" => 20,
));
我会拿到最后20分。现在你想订购id为ASC的记录,对吗?是否没有其他字段可以用于订购类似结果,例如日期或创建的字段?例如:

放弃二次排序,但为什么不直接使用数组反转呢

$models = array_reverse($models);

如果您想使用以下sql,有一种方法不使用array_reverse:

从'comments``t`中选择* 何处id 在选择id中 从注释中选择id,其中postID=xyz ORDER BY id DESC LIMIT 20 as q 按id订购ASC 以下哪项标准将成为:

$criteria=新的CDB标准; $criteria->condition='id in SELECT id FROM SELECT id FROM COMMENT,其中postID='.$id.'ORDER BY id DESC LIMIT 20 as q'; $criteria->order='id ASC'; 更新:

对于原始查询,您还可以使用:

$sql='SELECT*FROM SELECT*FROM comments其中postID=:postID ORDER BY id DESC LIMIT 20 q ORDER BY id ASC'; $params=数组'postid'=>$id; $comments=Comment::model->findAllBySql$sql,$params; 此查询的性能比我以前的查询要好。

UPD:

请注意,一般来说,其他一些解决方案比我的好

使用偏移量会降低查询的性能。 见:和

因此,当注释的数量增加时,性能可能会下降

使用偏移功能怎么样


是的,我很了解Yii,但我不知道如何以cactiverecord的方式表达sql请求。我无法表述的主要问题是frome子句是一个请求,我真的不知道如何用CActiveRecord样式来表达它。我不是唯一一个有这个问题的人,直到现在还没有人成功地回答:我再次阅读了文档,但我没有找到可以帮助我的东西!我现在看到的唯一一件事就是做:$criteria=newcdbcriteria$标准->限制=20$标准->顺序='id DESC'$models=array\u reverseComment::model->finAll$条件;但是我想避免使用array_reverse$criteria->order='id ASC';有什么问题?使用$criteria->order='IDASC';我将从comments表中获得前20个条目。我想要最后20个,但按升序排列!我认为在id DESC中,created ASC创建的ASC将只用于具有相同id的条目。我们应该将其理解为:我们按id DESC排序,然后如果它们具有相同的by created ASC,则id属性不是主键?为什么两条记录有相同的id?对不起,我的错,误读了你的回复。是的,你是对的。你为什么不想使用array_reverse?我想我最终会这么做的!我没有发现这是因为表演,但只有20个条目,它不应该是那么糟糕!是的,我认为array_reverse是一个不错的选择,20条记录肯定不会成为问题,除非表结构有加载和列加载。Soffset是一个好主意,但它可能不会在所有情况下都起作用。我不确定它似乎解决了问题,但你知道它在性能方面的表现如何吗?有3个sql请求,所以不会有点长吗?我可以推测:如果表很大,最内部的查询可能需要时间。第二级肯定会非常快,第三级也可能需要时间,这取决于桌子的大小。但是,由于这是一个id字段,我认为这不会花费太长时间。您必须对其进行测试,并将其与最初的array_reverse方法进行比较,我认为这也是一个不错的选择,但既然您要求使用另一种方法,那么就是这种方法。同时,我也会尽力把测试结果反馈给你。我不断增加种子表,直到10000条记录,并检查结果:1。在1000条记录时-多选=0.0031068325042725,数组_反向=0.00077199935913086,2。在10000条记录时,多选=0.02084899486694,阵列反转=0.00089120864868164。这些是微时差,正如您可以看到的那样,multiselect性能下降,而array_reverse的变化只是因为db查询需要更长的时间。所以你当然应该用你以前的方法。想不出一个替代查询,它将不受基准的db size.Thnaks的影响!那么我将坚持使用array_reverse,但您的答案仍然是对我的问题的回答,因为它显示了如何使用CActiveRecord执行请求!是的,你是对的,我没想过!所以今晚我将尝试findBySql和array_reverse,看看哪一个更好!
$models = array_reverse($models);
    $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);