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 ......
问题解答
回答1:首先你需要有个定义本地外地号码的字段,然后是否需要展示没有通话记录的号码,需要的话下面的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型分钟数的话,可能你还需要转换一下
回答2:执行以下SQL,将会得到如下结果: (你问题中期望的结果有点看不懂)
idnamephonetypecount23小白15523232323in1423小白15523232323out287SQL
SELECT a.id, a.name, b.phone, -- 坐席自己的电话 b.type, -- 呼入呼出 ’in’ or ’out’ b.count -- 次数FROM phoneList a LEFT JOIN (SELECT phone, type, count(1) AS count FROM phoneLog GROUP BY phone, type) b ON a.phone = b.phone回答3:
可以使用外连接查询
相关文章:
1. nignx - docker内nginx 80端口被占用2. css - 图片的宽度发生变化而高度却没有相应变?3. dockerfile - 为什么docker容器启动不了?4. 垃圾回收 - java 如何手动回收对象5. mysql - 请问有innodb 引擎的表导入900w 的数据,用了快9个小时。有什么快速的方法吗。正常是多少小时一般。6. javascript - vue中input的blur影响了下拉的点击事件如何解决7. javascript - chart.js如何修改某个指定bar的颜色8. php - 注册验证邮箱失效后操作问题9. mysql - 一个sql的问题10. angular.js - 在ionic下,利用javascript导入百度地图,pc端可以显示,移动端无法显示

网公网安备