< 返回首页

标哥的笔记,是记录在日常学习技术和日常开发中那些年遇到过的坑!本站为新站,原"标哥的技术博客"中的文章会慢慢移到本站,欢迎收藏本站!
在使用本站过程中,有任何建议请联系标哥! 另,承接App开发、网站开发和微信小程序开发!欢迎联系我们


ThinkPHP分组汇总统计如何实现

 作者:标哥    发布日期:2017-03-02 11:06    阅读量:6385次
 

ThinkPHP5如何实现分组多表查询呢?TP的功能确实很强大,但是用了这么久,一直不太会使用分组功能,今天特别针对项目研究了一下,看了一下官方的文档,终于弄明白了。今天记录下此方法,方便日后再次查阅时可回忆起来!

官方文档说明

官方文档关于join的说明文档在这里:http://www.kancloud.cn/manual/thinkphp5/118083

join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。

  • INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行

  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

官方说明最后一条:

//表名也可以是一个子查询
$subsql = Db::table('think_work')->where(['status'=>1])->field('artist_id,count(id) count')->group('artist_id')->buildSql();
Db::table('think_user')->alias('a')->join([$subsql=> 'w'], 'a.artist_id = w.artist_id')->select();

看到这里,我就想到办法了,原来子查询出来的结果作为表,再将此表与其他表关联查询即可!

需求说明

由于我需要统计耗材材料表每种材料的总耗材数量,因此需要将它做一个count运算,刚开始想不到办法,直接用Group by并不能得到我想要的结果。于是看了看文档后,才恍然大悟,弄明白了。

这里是先将耗材表做一个统计作为子查询,然后再与其他表做关联,得到其他表对应的子段值。

// 子查询得到子表,作为临时表与其他表进行内联查询
$subsql = db('material_use')->where('uid', $uid)
            ->field('material_id, sum(count) total_count')
            ->group('material_id')->buildSql();
$list = db('material_column')
            ->alias('mc')
            ->join('ruipai_material m', 'm.column_id = mc.id')
            ->join([$subsql => 'mu'], 'mu.material_id = m.id')
            ->group('mu.material_id')
            ->order('mu.total_count desc')
            ->paginate(12, false, [
                'query' => request()->param(),
]);

其实我也是看了W3C上的一段小例子,才想到这层的,其实我真的好笨~,链接:http://www.w3school.com.cn/sql/sql_groupby.asp


承接:ThinkPHP项目开发、网站项目开发、微信项目开发、微信小程序项目开发、App开发,欢迎联系标哥QQ632840804