仅当下一行具有相同的键时才对MySQL结果进行分组

时间:2014-12-21 11:22:54

标签: ios mysql sql

我试图模仿Apple的iOS在电话应用程序中排序通话记录的方式。

他们对电话进行排序的方式如下:

(original list)
—————————————————————
John - (Incoming)       - 10.30 am
John - (Missing)        - 10.00 am
John - (Outgoing) (3)   - 09.00 am
John - (Outgoing)       - Wednesday

(An incoming call is done)
—————————————————————
John - (Incoming) (2)   - 10.30 am <-- this row gets grouped (2)
John - (Missing)        - 10.00 am
John - (Outgoing) (3)   - 09.00 am
John - (Outgoing)       - Wednesday

(A missed call came)
—————————————————————
John - (Missing)        - 10.35 am <-- this row gets added (but not grouped with (*))
John - (Incoming) (2)   - 10.30 am
John - (Missing)        - 10.00 am --> (*)
John - (Outgoing) (3)   - 09.00 am
John - (Outgoing)       - Wednesday

基本上,这个App正在做的事情如下:

它从数据库中获取所有调用,如果两个或多个调用类型相等(缺失,传入或传出),并且也是下一行,它们被分组为一行,数字指示符显示分组量否则,只需将行添加到表视图中,不会有任何奇怪的操作。

我尝试做的事情是,当下一行与前一行的类型相同时,按类型分组。我知道如何使用代码执行此操作,我想知道是否有任何方法可以通过仅限SQL 来实现。

2 个答案:

答案 0 :(得分:0)

最好是你共享一个你已经创建了DDL语句的小提琴sql并且所有的支持都可以找到最好的查询,但假设你有一个表,这里有3列我可以写的。

select name, type_of_call, count(type_of_call), last(call_time) from call_history
group by name, type_of_call;

答案 1 :(得分:0)

在MySQL中,您可以使用变量执行此操作:

select calltype, count(*) as numcalls, max(calltime)
from (select ch.*,
             (@rn := if(@t = type_of_call, @rn,
                        if(@t := type_of_call, @rn + 1, @rn + 1)
                       )
             ) as grp
      from CallHistory ch cross join
           (select @rn := 0, @t := '') vars
      order by calltime
     ) ch
group by grp, calltype;

这是添加&#34;排名&#34;变量到调用类型。变量仅在调用类型更改时递增。输出查询将值组合在一起以提供&#34;摘要&#34;信息。