ThinkPHP获取group by使用方法

作者:袖梨 2022-11-14

使用ThinkPHP获取group by总数可能并不是期望得到的结果,tp中语句如下:


$count = $this->xxx->where($where)->group($group)->count();

生成的sql语句:


SELECT count(*) FROM `xxx` WHERE ( (`biz_date` >= '20151014') AND (`biz_date` <= '20160111') ) GROUP BY biz_date

这样查出来的总数并不是这个结果集的条数.


如图:

group_by_count_mysql

结果是根据group by这个字段分组的每个分组总数。

那么获取结果总条数的正确的方式是:


//返回总数
if ($total) {
$sql = $this->xxx->where($where)->group($group)->buildSql();
$sql = 'select count(*) as tp_sum from' . $sql . 'as tt';
$result = $this->xxx->query($sql);
//echo $this->xxx->_sql();exit;
return $result[0]['tp_sum'];
}

也就是通过这样的sql语句来求group by的总条数:


select count(*) as tp_sum from( SELECT * FROM `xxx` WHERE ( (`biz_date` >= '20151014') AND (`biz_date` <= '20160111') ) GROUP BY biz_date )as tt
这样就OK了

group by实例

实例一

数据表:

姓名 科目 分数
张三 语文 80
张三 数学 98
张三 英语 65
李四 语文 70
李四 数学 80
李四 英语 90

期望查询结果:

姓名 语文 数学 英语
张三 80 98 65
李四 70 80 90

代码


create table testScore
(
tid int primary key identity(1,1),
tname varchar(30) null,
ttype varchar(10) null,
tscor int null
)
go
---插入数据
insert into testScore values ('张三','语文',80)
insert into testScore values ('张三','数学',98)
insert into testScore values ('张三','英语',65)
insert into testScore values ('李四','语文',70)
insert into testScore values ('李四','数学',80)
insert into testScore values ('李四','英语',90)


select tname as '姓名' ,
max(case ttype when '语文' then tscor else 0 end) '语文',
max(case ttype when '数学' then tscor else 0 end) '数学',
max(case ttype when '英语' then tscor else 0 end) '英语'
from testScore
group by tname

相关文章

精彩推荐