【问题标题】:Using Yii Active Record to find max of one column使用 Yii Active Record 查找最多一列
【发布时间】:2012-08-29 20:44:51
【问题描述】:

如何通过 Yii Active Record 找到数据库中一列的最大值?

我可以通过纯sql和createCommand方法来做,但是我想通过Active Record和CDbCriteria class来做。有什么办法吗?

【问题讨论】:

    标签: php mysql activerecord yii max


    【解决方案1】:

    您需要按如下方式更改选择条件。

    $model = new Model;
    $criteria=new CDbCriteria;
    $criteria->select='max(column) AS maxColumn';
    $row = $model->model()->find($criteria);
    $somevariable = $row['maxColumn'];
    

    参考:

    http://www.yiiframework.com/forum/index.php/topic/6730-how-can-i-use-max-in-find-method/page_view_findpost_p_80659

    【讨论】:

      【解决方案2】:

      这样可以避免创建不必要的临时对象:

      $criteria = new CDbCriteria;
      $criteria->select = 'max(column)';
      // additional where conditions, if you so wish
      $criteria->addColumnCondition(array('published' => 1));
      $model = SomeModel::model();
      $value = $model->commandBuilder->createFindCommand(
          $model->tableName(), $criteria)->queryScalar();
      

      【讨论】:

        【解决方案3】:

        您可以通过 DESC 例如限制结果和顺序

        $criteria = new CDbCriteria;
        $criteria->order = 'column DESC';
        $row = Model::model()->find($criteria);
        $somevariable = $row->column;
        

        【讨论】:

          【解决方案4】:

          如果需要 WHERE 子句:

          在控制器中:

          $max = $model->getMax($filter);
          

          在模型中:

          public $maxColumn = 0;
          public function getMax($filter = null)
          {
              /* Get max in column1 WHERE column2 = $filter */
              $criteria               = new CDbCriteria;
              $criteria->select       = 'MAX(t.column1) as maxColumn';
              $criteria->condition    = 't.column2 LIKE :parm';
              $criteria->params       = array(':parm'=>$filter);
          
              $tempmodel  = $this->find($criteria);
              $max        = $tempmodel['maxColumn'];
              return $max;
          }
          

          【讨论】:

            【解决方案5】:
            $model = MyModel::model();
            
            $maxId = $model->getCommandBuilder()
                    ->createSqlCommand('SELECT MAX(id) FROM '.$model->tableName())
                    ->queryScalar();
            
            $maxId = Yii::app()->db
                    ->createCommand('SELECT MAX(id) FROM '.$model->tableName())
                    ->queryScalar();
            

            【讨论】:

              【解决方案6】:

              就是这样。

              function getMaxId( $modelName ){
                  $criteria = new CDbCriteria;
                  $criteria->order = 'id DESC';
                  $model = $modelName::model()->find( $criteria );
                  return $model->id;
              }
              

              【讨论】:

              • 这不够灵活。如果我有一张用户表,其中存储了他们的年龄、体重和身高,并且想要选择前 10 个最高的人并获得该子集的最大体重,我无法扩展您的答案以获得我想要的结果.
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-01-03
              • 2013-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多