搜尋

首頁  >  問答  >  主體

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 天前849

全部回覆(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
  • 取消回覆