回答

收藏

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

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

有一个数据库表,包括每个用户在城市的登录记录。我需要知道一个用户在一个城市呆了多少天,然后一个用户访问了一个城市多少次(包括在一个城市停留的天数)。
& ]6 E+ c2 y% x) f因此,考虑到我有下表(简化,只包括DATETIMEs - 相同的用户和城市):- I" t" k: m- N
          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
    3 `# |; F* E6 v/ F; A6 ^; y1 t; n- R
用户去过这个城市的天数是6    ( 30.06    ,01.07    ,02.07    ,01.08    ,05.08    ,06.08    )。3 R/ S1 @# a: R6 k5 e) g( |5 m7 C
我想用 SELECT COUNT(id) FROM table GROUP BY DATE(datetime)3 r) k0 L9 e5 X2 H/ E. K* l6 c( W* I
然后,查询用户访问城市的次数应返回3    ( 30.06-02.07    ,01.08    ,05.08-06.08    )。4 L0 K2 [% y$ k
问题是我不知道如何构建这个查询。. s! K; Q) F+ f* Y2 ]
感谢任何帮助!
5 p, f- K- V( M9 l6 m. z                                                               
* F4 }: u. `* I: ]    解决方案:                                                                7 r4 o2 m  N- z* b" }- x% H. f+ _5 Z
                                                                每次访问的第一天,你都可以找到前一天没有签到的签到。5 H% g2 A; Y5 M' a  ?7 Y6 \' \
    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
    6 p( ^. O2 ?  N( R
这个查询有几个重要部分。' b, z& \- x/ A1 I9 z* o
首先,每个签名都与前一天的任何签名相结合。然而,由于它是外部连接,如果前一天没有签名,将在连接的右侧NULL结果。该WHERE过滤发生在加入后,所以只保留从左侧到右侧的签名。LEFT OUTER JOIN/WHERE IS NULL找到那里的东西很方便不是: z- Y4 P2 a  b5 z
然后它会计算不同的签到日期,以确保用户在访问的第一天多次签到,不会重复计算。(当我发现可能的错误时,我实际上在编辑时添加了这部分。
& m% t; B. l; l6 C  b. N编辑:我刚刚重新阅读了您对第一个问题的查询。您的查询将获得给定日期的登录次数,而不是日期计数。我想你想要这样的东西:
; U0 L) T/ R( R0 b' U
    select count(distinct date(datetime))from checkinwhere user='some user' and city='some city'
    : t  P6 `# e6 K4 b4 w. x# p# m4 _
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则