2017-03-07 61 views
0

子選擇查詢有用於從用戶登錄呼叫表:同一個表

users: 
- Id INT 11 
- Name VARCHAR 30 

calls: 
- Id  INT 11 
- UserId INT 11 
- DateBgn DATETIME 
- DateEnd DATETIME 
- Number VARCHAR 30 
- Type TYNYINT 1 

Type: 1-Incoming call/2-Outgoing call 

我的SQL知識是非常有限的,但我被要求創建一個查詢,列出10個最常用的電話並獲得按類型(OMG!)分隔的持續時間(以秒爲單位)。事情是這樣的:

Phone  Type1 Type2 
000-0000 350 210 
111-1111 300 150 
222-2222 300 140 
333-3333 230 200 

已經能夠獲得通話時間(秒):

TIME_TO_SEC(TIMEDIFF(DateEnd, DateBgn)) 

這裏是我走到這一步:

SELECT 
    Number, 
    SUM(TIME_TO_SEC(TIMEDIFF(DateEnd, DateBgn))) AS Duration 
FROM 
    calls 
WHERE 
    UserId = 10 AND 
    Type = 1   # Incomming Call 
GROUP BY 
    Number 
ORDER BY 
    2 DESC 
LIMIT 10; 

這個SQL上面所列內容我頂10個最常用的電話號碼,但只有來電(類型= 1)。請,我如何列出兩個分開的類型?

謝謝!


編輯:

我創建了一個SQL搗鼓更好地瞭解和測試: http://sqlfiddle.com/#!9/aaf9b4/1

+0

什麼是 「最常用的」 是什麼意思? –

+0

@juergend,對不起,英語不是我的母語。 「最常用的」意思是更高的TIME_TO_SEC(TIMEDIFF(calls.End,calls.Start))。謝謝! – Guybrush

回答

0

使用條件聚集

SELECT 
    Phone, 
    SUM(case when Type = 1 then TIME_TO_SEC(TIMEDIFF(End, Start)) else 0 end) AS Duration1, 
    SUM(case when Type = 2 then TIME_TO_SEC(TIMEDIFF(End, Start)) else 0 end) AS Duration2 
FROM 
    calls 
WHERE 
    UserId = 10   
GROUP BY 
    Phone 
ORDER BY 
    SUM(TIME_TO_SEC(TIMEDIFF(End, Start))) DESC 
LIMIT 10; 
+0

再次感謝您!我會盡力讓你知道! – Guybrush

+0

我更新了'order by' –

+0

對不起,我爲了更好理解而創建了I SQL小提琴。請看看http://sqlfiddle.com/#!9/aaf9b4/1 – Guybrush