mysql - 同一个表的子选择查询

标签 mysql sql

有一个表用于记录用户的调用:

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/

相关文章:

mysql - mysql中的季度分析/月分析

mysql - 在 MySQL 表中表示多值元素的方法

javascript - 如何从我用 PHP 填充的选择中获取文本值

mysql - 如何使用 field = old_value + new_value 更新 Sphinx 实时索引?

mysql 嵌套 IF 语句

sql - 相关记录的条件计数

mysql - 选择字段为非空的所有项目

mysql - SQL 查询左连接 where 子句

java - 使用 SQL 将 Date Java 与数据库表中的 DateTime 列进行比较

mysql - SQL查询字符串按分隔符分割