当前位置: 首页 > 后端技术 > PHP

ORM-Ignoredcountstatisticsaftergroupby

时间:2023-03-30 02:40:32 PHP

导致在使用某PHP框架的sql查询器时,发现每次添加分组条件后,page方法的返回参数一个是数据集,另一个是数据集是总数。总数总是不准确的。问题所以,我看了一下框架模型的实现方法。对于下面的sql查询器,page()方法会执行两条sql,一条是查询数据集,一条是查询符合条件的数据集总数,对应返回[list,total]。list($list,$total)=$articleModel->select(['XXX','XXX',])->groupBy('type')->page($page,$num);total不允许,问题出在sql的查询和处理结果上。对于上述业务的查询,会生成:#sql1selectcount(*)fromarticlegroupbytype;比较sql1和下面的sql2,想想有什么区别?#sql2selectcount(*)fromarticle;sql2是计算的整个表的总记录数,返回的结果永远只有一条数据;sql1在sql2中加入了一个类型条件分组,分组后计算每个分组的记录总数,即type1的总数,type2的总数……,返回结果为1-N。解决框架的bug正是在这里,在处理普通查询和分组查询时,没有单独处理。在框架count()中,统一取结果集的第一个值作为总数,在普通查询中没有问题;但是在组查询中,只能得到type1组下的总数。按组查询时,我们需要得到应该一直使用的组数。//框架中的原代码publicfunctioncount($column='*'){if(!$this->DB){thrownewException('你还没有连接到数据库',Exception::CODE_DATABASE_ERROR);}$bak=$this->_sql;$sql=$this->buildSql($column);$this->sql=$sql;如果($this->justSql){返回0;}$info=$this->DB->query($sql)->fetch(\PDO::FETCH_ASSOC);//就是这个问题,只获取结果集的第一条记录$this->lastQueryAt=time();返回isset($info['num'])?$info['num']:0;}发现了问题,于是修改,提交pr给框架。修改后的代码如下://修改后的代码publicfunctioncount($column='*'){if(!$this->DB){thrownewException('你还没有连接到数据库',Exception::CODE_DATABASE_ERROR);}$bak=$this->_sql;$sql=$this->buildSql($column);$this->sql=$sql;如果($this->justSql){返回0;}$总计=0;if(count($bak['group'])>0){$info=$this->DB->query($sql)->fetchAll(\PDO::FETCH_ASSOC);//有组时,获取结果Setmultiplerecords$total=count($info);}else{$info=$this->DB->query($sql)->fetch(\PDO::FETCH_ASSOC);//当没有分组时,还是像以前一样取结果集的第一条记录$total=isset($info['num'])?$信息[‘数量’]:0;}$this->lastQueryAt=time();返回$总计;}结尾!