搜索

首页  >  问答  >  正文

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 ......

世界只因有你世界只因有你2774 天前850

全部回复(3)我来回复

  • 高洛峰

    高洛峰2017-05-18 10:56:32

    首先你需要有个定义本地外地号码的字段,然后是否需要展示没有通话记录的号码,需要的话下面的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型分钟数的话,可能你还需要转换一下

    回复
    0
  • PHP中文网

    PHP中文网2017-05-18 10:56:32

    执行以下SQL,将会得到如下结果: (你问题中期望的结果有点看不懂)

    id name phone type count
    23 小白 15523232323 in 14
    23 小白 15523232323 out 287

    SQL

    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

    回复
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-18 10:56:32

    可以使用外连接查询

    回复
    0
  • 取消回复