对同一个表进行子选择查询

时间:2017-03-07 18:08:43

标签: mysql sql

有一个表用于记录来自用户的呼叫:

     var Bus= angular.module('Bus',[]);


   Bus.controller('BusController',function($scope,$http) {

$scope.business = {}

$scope.submitMyForm=function(){
       console.log($scope.business);
        var q=JSON.stringify($scope.business)  
         console.log(q)

            $

            .ajax({
                type : 'POST',
                url : " some url",
                data :JSON.stringify($scope.business),

                success: function(){
                          alert('success');
                           },

                error : function(e) {
                    console.log(e);
                    alert('oops!!');
                },
                dataType : "json",
                contentType : "application/json"
            });
        };
}); 

我对SQL的了解非常有限,但我被要求创建一个查询来列出10个最常用的手机,并按类型(OMG!)分隔它们的持续时间(以秒为单位)。像这样:

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

已经可以在几秒钟内获得通话时间:

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))

这个SQL上面列出了我最常用的十大电话号码,但只有来电(type = 1)。请问,如何列出两种分开的类型?

谢谢!

编辑:

我创建了一个SQL小提琴,以便更好地理解和测试: http://sqlfiddle.com/#!9/aaf9b4/1

1 个答案:

答案 0 :(得分: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;