问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

thinkphp视图模型3张表联合查询

发布网友 发布时间:2022-04-07 05:00

我来回答

2个回答

懂视网 时间:2022-04-07 09:21

前些天有朋友问到了一个联表的聚合查询问题,想到此问题可能很多新手处理都比较棘手,现在特意分享出来。

我们有两个数据表:

bus表:QQ截图20200512103514.jpg

user表:

54.jpg

需求:统计每个人上车数量

如何实现呢?

第一步:联表

这种场景肯定需要两个数据表联表,我们先不考虑统计,我们先进行两个数据表联表。

 $data=Db::name('user')->alias('a')->join('bus b','a.user_id=b.user_id')->select()->toArray();

alias是别名,join是联表的数据表,并且有联表条件a.user_id=b.user_id,这样我们就能够获取到两个数据表联表的数据了。

QQ截图20200512103749.jpg

第二步:聚合查询

在做聚合查询前,我们先看下官方手册的教程。

8.jpg

因为我们最终是要获取统计的数量,所以我们首先确定用count()方法,所以我们修改查询语句:

$data=Db::name('user')->alias('a')->field('count(b.user_id) AS c'')->join('bus b','a.user_id=b.user_id')->select()->toArray();

这其中c,是别名。

我们需要根据user_id这个字段进行聚合查询,是根据这个字段统计的,所以我们肯定是group(user_id),也就是按照user_id这个字段进行分组。

我们继续修改查询语句:

$data=Db::name('user')->alias('a')->field('count(b.user_id) AS c')->join('bus b','a.user_id=b.user_id')->group('a.user_id')->select()->toArray();

这样我们就实现了我们的最终查询结果。

第三点:注意情况

在上面的查询语句中,如果mysql是5.7版本,那么需要格外注意。比如在mysql5.7中在field中添加a.*,就会报错:

 $data=Db::name('user')->alias('a')->field('a.*,count(b.user_id) AS c')->join('bus b','a.user_id=b.user_id')->group('a.user_id')->select()->toArray();
 [object Object]

为什么会有这样的错误呢?

QQ截图20200512104036.jpg

MYSQL5.7为了更好的性能,对sql_mode的限制。

ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作的时候,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,这也就是报错所在。

我们可以修改mysql配置:

修改/etc/my.cnf,将sql_mode=中的only_full_group_by给删掉

这样一个联表的聚合查询就实现了,我们遇到这个问题的时候,不要心急,根据最终的需求,一步步的拆分一步步的实现。

热心网友 时间:2022-04-07 06:29

连接不建议做聚合操作,很容易出问题,一般这种都直接同步用户的消费金额,换句话说,就是再单独一份用户消费表,用户有消费的时候就增加这个字段的值。

或者把你的sql客房订单和餐饮订单分开写,不然就只有嵌套了,似乎没有这个必要
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我网贷一万,手续费300,分24期,每期506.67,请问怎么计算月息,和年利率... 多普达手机铃音多普达手机铃声 【车载软件推荐】有车一族必备软件有哪些?好用的车主必备app 我画画时常被说我画画不动脑筋,弱弱的问一句,画画怎样动脑筋? 三星手机如何设置时间在桌面显示? 精确到十分位,要看小数点右边第一位 对吗 要把一个小数精确到十分位,就要看这个小数的( )A.十分位B.百分位C... 黑米算不算粗粮 存定期协议利率选是还是否? 同城上那些卖二手ndsi的是真的吗? 一个身份证能办两个建设银行卡吗 一张身份证可不可以在同一家建设银行办两张银行卡 一张身份证可以办几张建行卡呢? ipad air 中safari浏览器看视频时怎样全屏 最近iPad 用safari看视频为什么不能把视频全屏?而且凤凰网视频也无法打开了?以前是好的啊! iphone safari 怎么分屏 iphone的safari浏览器怎么样一直保持横屏 我梦到一家三口在游泳池游泳 如何给股票估值和定价? 梦见自家游泳池。还没盖好,动物都过来侵犯小孩,还有偷小孩的,什么 梦到前男友家有个很大的游泳池 梦见自己的卧室成了游泳池,是什么意思呀 梦见自己家里有一个大游泳池,老公在洗澡 股票投资:成长型企业该怎么估值? 梦见在自己家里游泳 关于公司估值 股票价值方面的问题 梦见屋里有一个装了水的大泳池? 01579组成一个四位数最大的偶数是多少最小的奇数是多少? 问世间有几个好女孩? ThinkPHP 如何实现不同服务器上相同数据库数据表联合查询 一张身份证可以办几张银行卡,比如建设银行的卡 2020国家公务员考试云南有哪些考点? 生病了十多天请假没上班,今天又开始上班了发个朋友圈句子 突然之间不上班,怎么样描述自己的心情,发一下朋友圈? 我辞工不上班了,想在朋友圈发的话题有哪些? 要辞职了,朋友圈怎么发说说? 云南省公务员考试怎么复习 请假没去上班,发了个朋友圈,同事说我不去上班还出去玩,别的同事会说我什么吗? 朋友头上有虱子,我玩手机时她里我的头比较近我还在她床上躺了一会,会被传染吗不过当天回到家我就洗头了 自己结婚需要请假,工作朋友圈怎么发? 我同桌的头上竟然有虱子!!我的天!我不会被传染吧??? 请假一个月回复工作状态发什么朋友圈 当生病了,向领导请假,没有得到领导的批准,怎么发朋友圈? 我要离开我的工作岗位.和同事合影留念,现在我想发到朋友圈.怎么说 头上长虱子是什么意思,好不好,代表什么 请假假期结束,回到工作岗位怎么向客户说明? 不听工作安排怎么发圈 驱动精灵无法正确连接到网络,怎么办?! 家里人头上有虱子,去他家会不会被传染上 别人头上的虱子蹦到我身上有什么寓意?