回答

收藏

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

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

有一个数据库表,包括每个用户在城市的登录记录。我需要知道一个用户在一个城市呆了多少天,然后一个用户访问了一个城市多少次(包括在一个城市停留的天数)。
$ w& v) k+ A* x" R5 m: O5 S因此,考虑到我有下表(简化,只包括DATETIMEs - 相同的用户和城市):8 n& m* }6 ?6 R+ M
          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
    " C7 f' _; ?0 l# S, e% Q  W% Z
用户去过这个城市的天数是6    ( 30.06    ,01.07    ,02.07    ,01.08    ,05.08    ,06.08    )。
* ~1 \/ s$ e1 M8 G5 ]4 `我想用 SELECT COUNT(id) FROM table GROUP BY DATE(datetime)
& I3 o  N) n8 }$ `7 W. w7 {% ]3 ?然后,查询用户访问城市的次数应返回3    ( 30.06-02.07    ,01.08    ,05.08-06.08    )。
+ p& v* h+ u4 w, k7 `问题是我不知道如何构建这个查询。3 }5 j6 \% f! X$ [
感谢任何帮助!+ C5 L1 C6 T* S1 ^# A! Z+ _5 i
                                                               
2 o! P& `3 Q" _8 X) S; W8 c7 Q    解决方案:                                                                ' d2 G" B2 R% L6 Z( x5 p4 J
                                                                每次访问的第一天,你都可以找到前一天没有签到的签到。$ G% }9 Y3 y# \& I' O
    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$ L5 f. w# }9 k, I1 O- N
这个查询有几个重要部分。
3 F" \3 _# [( ~6 M! Q首先,每个签名都与前一天的任何签名相结合。然而,由于它是外部连接,如果前一天没有签名,将在连接的右侧NULL结果。该WHERE过滤发生在加入后,所以只保留从左侧到右侧的签名。LEFT OUTER JOIN/WHERE IS NULL找到那里的东西很方便不是
* p1 t. [( |' }. C1 T. t然后它会计算不同的签到日期,以确保用户在访问的第一天多次签到,不会重复计算。(当我发现可能的错误时,我实际上在编辑时添加了这部分。" a+ _, W4 I. ]- N+ d7 `, `! w, h0 [
编辑:我刚刚重新阅读了您对第一个问题的查询。您的查询将获得给定日期的登录次数,而不是日期计数。我想你想要这样的东西:
" O7 {1 o- M  L' [) C
    select count(distinct date(datetime))from checkinwhere user='some user' and city='some city'
    2 x; X5 I* o. o& {
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则