mysql 一对多 怎么在从表上面进行多条件多次统计

编程入门 行业动态 更新时间:2024-10-27 07:29:00
本文介绍了mysql 一对多 怎么在从表上面进行多条件多次统计的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

问 题

主表 用户表id name phone (关联字段)

从表 通话记录表id phone(关联字段) ot_phone time type (呼入呼出) input_time

联系人表id c_id phone

公司表c_id name

怎么统计每个人的电话情况(列表limit 0,10) 呼入几次呼出几次本地号码几次外地号码几次总呼入时间多少总呼出时间多少匹配公司多少(主要是这个,因为联系人表的phone有相同的,但对应不同公司,left join sum()数据不准确)匹配公司通话时间多少.......

主要问题是:联系人表的phone不唯一,有重复手机号,例如一个人在两家公司任职leftjoin 之后 sum 公司会有重复数据,数据不准确

其实我想过联系人表phone去重之后在 跟别的表join,但是这样速度会变得巨慢,要50s联系人的表是5w以上的

好像这个是不能一条sql解决的

最终结果类似变成id name phone in_num(呼入次数) out_num(呼出次数) local_phone_num(本地号码) .......23 '小白' 15523232323 45 120 30 .....24 '小红' 18823232323 70 93 41 ......

解决方案

首先你需要有个定义本地外地号码的字段,然后是否需要展示没有通话记录的号码,需要的话下面的sql改成left join并且右表取值需要做一下判空处理,不需要的话就可以直接用了

select id,name,phone, sum(case when type='in' then 1 else 0 end) cnt_in, sum(case when type='out' then 1 else 0 end) cnt_out, sum(case when iflocal='1' then 1 else 0 end) cnt_local, sum(case when iflocal='0' then 1 else 0 end) cnt_nonlocal, sum(case when type='in' then input_time else 0 end) alltime_in, sum(case when type='out' then input_time else 0 end) alltime_out from userlist a join phonelist b on a.phone=b.phone group by a.phone;

补充一下,b表的通话时间如果不是统计的int型分钟数的话,可能你还需要转换一下

更多推荐

mysql 一对多 怎么在从表上面进行多条件多次统计

本文发布于:2023-10-28 18:47:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1537468.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多条   表上   mysql

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!