有一个表用于记录用户的调用:
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 个最常用的手机,并获取按类型分隔的持续时间(以秒为单位)(天哪!)。像这样的事情:
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 Fiddle 以更好地理解和测试: http://sqlfiddle.com/#!9/aaf9b4/1
最佳答案
使用条件聚合
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;
关于mysql - 同一个表的子选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655310/