2016-07-22 133 views
1

所以我有一個超過900萬條記錄的mysql表。他們是通話記錄。每條記錄代表1個獨立呼叫。各列如下:在Mysql查詢中具體where子句

CUSTOMER 
RAW_SECS 
TERM_TRUNK 
CALL_DATE 

還有其他人,但這些是我將使用的。 所以我需要計算特定Term Trunk中某個星期的總呼叫次數。然後我需要總結這些呼叫的秒數。然後我需要計算低於7秒的呼叫總數。我總是在2個查詢中完成這項工作,並將它們結合起來,但我想知道是否有辦法在一箇中完成它?我是新來的mysql,所以我敢肯定,我的語法是可怕的,但這裏是我做的......

查詢1:

SELECT CUSTOMER, SUM(RAW_SECS), COUNT(*) 
FROM Mytable 
WHERE TERM_TRUNK IN ('Mytrunk1', 'Mytrunk2') 
GROUP BY CUSTOMER; 

查詢2:

SELECT CUSTOMER, COUNT(*) 
FROM Mytable2 
WHERE TERM_TRUNK IN ('Mytrunk1', 'Mytrunk2') AND RAW_SECS < 7 
GROUP BY CUSTOMER; 

有任何方式將這兩個查詢合併爲一個?或者也許只是一個更好的方法呢?我感謝所有的幫助!

+0

沒有。不是真的。 'sum(raw_secs)'和'raw_secs <7'具有矛盾的目的。你可以擺弄'有raw_secs <7',但我猜這不會產生你想要的。 –

+0

如果你想合併查詢,輸出需要被塑造成相同。如果你有類似的列,你可以使用'UNION ALL'並在一次調用中得到結果。 –

+0

我想第二個查詢的RAW_SECS來自第一個查詢的總和。在GROUP BY後面使用'HAVING'作爲聚合過濾器,如'HAVING SUM(RAW_SECS)<7'。 – Tin

回答

0

有2種方式在單一查詢獲得預期的結果:

  • 條件計數:使用CASE表達式或count()(或sum())來算只有特定的記錄

    內,如果()函數
  • 使用自聯接:使用表格的id字段和聯接條件左連接表格在連接的右側過濾短於7秒的聯接的別名

第二種方法的優點是,您可能能夠使用索引加速它,而條件計數不能使用索引。

SELECT m1.CUSTOMER, SUM(m1.RAW_SECS), COUNT(m1.customer), count(m2.customer) 
FROM Mytable m1 
LEFT JOIN Mytable m2 ON m1.id=m2.id and m2.raw_secs<7 
WHERE TERM_TRUNK IN ('Mytrunk1', 'Mytrunk2') 
GROUP BY CUSTOMER;