回答

收藏

MySQL:按连续天数分组并计数组

技术问答 技术问答 318 人阅读 | 0 人回复 | 2023-09-12

有一个数据库表,包括每个用户在城市的登录记录。我需要知道一个用户在一个城市呆了多少天,然后一个用户访问了一个城市多少次(包括在一个城市停留的天数)。
' p+ U: W$ t- [, Z6 ?2 u* C' H因此,考虑到我有下表(简化,只包括DATETIMEs - 相同的用户和城市):0 W2 d5 b9 ^( C1 o, x9 |8 w
          datetime-------------------2011-06-30 12:11:462011-07-01 13:16:342011-07-01 15:22:452011-07-01 22:35:002011-07-02 13:45:122011-08-01 00:11:452011-08-05 17:14:342011-08-05 18:11:462011-08-06 20:22:12
    ) `8 T0 q, \9 x8 h3 F! \9 ?
用户去过这个城市的天数是6    ( 30.06    ,01.07    ,02.07    ,01.08    ,05.08    ,06.08    )。8 J0 ~( R% A4 U3 g* C, W& E  ?% T
我想用 SELECT COUNT(id) FROM table GROUP BY DATE(datetime)
4 ~% \2 `& O2 y) i然后,查询用户访问城市的次数应返回3    ( 30.06-02.07    ,01.08    ,05.08-06.08    )。- q, A$ F0 u5 p, ^$ S
问题是我不知道如何构建这个查询。& d! u: m0 Z+ u$ ^) c% M9 m
感谢任何帮助!
# E& ^/ e# O. S/ A5 y6 Q( s( y                                                                3 U1 K6 }( f1 l5 ]4 c+ P0 p
    解决方案:                                                               
# a) Q% B' N; s! W                                                                每次访问的第一天,你都可以找到前一天没有签到的签到。- @  z0 R' l* E4 |0 r+ C
    select count(distinct date(start_of_visit.datetime))from checkin start_of_visitleft join checkin previous_day    on start_of_visit.user = previous_day.user    and start_of_visit.city = previous_day.city    and date(start_of_visit.datetime) - interval 1 day = date(previous_day.datetime)where previous_day.id is null
    $ H/ s5 k- X& ]) Q, J  W
这个查询有几个重要部分。
+ j/ h6 L- F  X7 T+ q! ^9 K首先,每个签名都与前一天的任何签名相结合。然而,由于它是外部连接,如果前一天没有签名,将在连接的右侧NULL结果。该WHERE过滤发生在加入后,所以只保留从左侧到右侧的签名。LEFT OUTER JOIN/WHERE IS NULL找到那里的东西很方便不是. V6 U+ Z, \4 l$ {2 y/ U3 N7 q
然后它会计算不同的签到日期,以确保用户在访问的第一天多次签到,不会重复计算。(当我发现可能的错误时,我实际上在编辑时添加了这部分。
: L) D$ [. \4 c1 e' ?7 j编辑:我刚刚重新阅读了您对第一个问题的查询。您的查询将获得给定日期的登录次数,而不是日期计数。我想你想要这样的东西:
& L1 `: H' J% {' [: f
    select count(distinct date(datetime))from checkinwhere user='some user' and city='some city'
    4 O9 G$ A7 z+ z3 t/ y" n( k
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则