Heim  >  Fragen und Antworten  >  Hauptteil

Mysql one-to-many So führen Sie mehrere Bedingungen und mehrere Statistiken für die Slave-Tabelle durch

Haupttabelle Benutzertabelle
ID-Name Telefon (zugeordnetes Feld)

Aus Tabelle Anrufaufzeichnungstabelle
ID-Telefon (zugeordnetes Feld) ot_phone-Zeittyp (eingehende und ausgehende Anrufe) input_time

Kontaktformular
id c_id phone

Firmentabelle
c_id-Name

So zählen Sie alle Anrufe (Listenlimit 0, 10)
Wie viele eingehende Anrufe
Wie viele ausgehende Anrufe
Wie viele Ortsnummern
Wie viele Nummern außerhalb der Stadt
Wie viele eingehende Anrufe insgesamt
Wie viele ausgehende Anrufe insgesamt
Wie viele übereinstimmende Unternehmen (Hauptsächlich aus diesem Grund, da die Telefone in der Kontakttabelle das gleiche Telefon haben, aber unterschiedlichen Unternehmen entsprechen, sind die Daten der linken Join-Summe () ungenau)
Übereinstimmen Sie die Anrufzeit des Unternehmens
.... .

Das Hauptproblem ist: Die Telefonnummer in der Kontakttabelle ist nicht eindeutig, es gibt doppelte Telefonnummern, zum Beispiel arbeitet eine Person für zwei Unternehmen
Nach der Left-Join-Summe
Das Unternehmen verfügt über doppelte Daten und die Daten sind ungenau

Eigentlich habe ich darüber nachgedacht, das Kontakttischtelefon zu deduplizieren und es dann mit anderen Tischen zu verbinden, aber das wäre extrem langsam und würde 50 Sekunden dauern
Der Kontakttisch kostet mehr als 50.000 Yuan

Es scheint, dass dies nicht mit einem einzigen SQL gelöst werden kann

Das Endergebnis
ähnelt
id name phone in_num (Anzahl der eingehenden Anrufe) out_num (Anzahl der ausgehenden Anrufe) local_phone_num (lokale Nummer) .......
23 '小白' 15523232323 45 120 30 .. ...
24 '小红' 18823232323 70 93 41 ......

世界只因有你世界只因有你2710 Tage vor786

Antworte allen(3)Ich werde antworten

  • 高洛峰

    高洛峰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型分钟数的话,可能你还需要转换一下

    Antwort
    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

    Antwort
    0
  • 淡淡烟草味

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

    可以使用外连接查询

    Antwort
    0
  • StornierenAntwort