回答

收藏

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

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

有一个数据库表,包括每个用户在城市的登录记录。我需要知道一个用户在一个城市呆了多少天,然后一个用户访问了一个城市多少次(包括在一个城市停留的天数)。, J, n' c- o0 h) c7 s5 ^  {
因此,考虑到我有下表(简化,只包括DATETIMEs - 相同的用户和城市):
$ |3 ^6 D; @3 X1 P% j4 ]7 W# a
          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, n8 G  A4 v# y1 D
用户去过这个城市的天数是6    ( 30.06    ,01.07    ,02.07    ,01.08    ,05.08    ,06.08    )。
  S8 ?, P+ I9 J1 g" g7 M# f9 ]  V我想用 SELECT COUNT(id) FROM table GROUP BY DATE(datetime)
1 `; }! u; P( y然后,查询用户访问城市的次数应返回3    ( 30.06-02.07    ,01.08    ,05.08-06.08    )。9 k; v; V4 D  P, q! z
问题是我不知道如何构建这个查询。+ G3 ~5 x) B% {- b
感谢任何帮助!5 d" b9 v* A9 X: I
                                                                - ~/ j, K. H5 H4 |" v
    解决方案:                                                               
  ]' }9 ]. a* X: D& @                                                                每次访问的第一天,你都可以找到前一天没有签到的签到。" K3 r% I( ?+ z# T$ |9 Q4 I
    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! t; P3 s3 p" w/ l2 w, J
这个查询有几个重要部分。5 l, y" A  ^% u2 s3 V; H
首先,每个签名都与前一天的任何签名相结合。然而,由于它是外部连接,如果前一天没有签名,将在连接的右侧NULL结果。该WHERE过滤发生在加入后,所以只保留从左侧到右侧的签名。LEFT OUTER JOIN/WHERE IS NULL找到那里的东西很方便不是
2 h  ^6 C; E( j: i* [/ u6 ~: E然后它会计算不同的签到日期,以确保用户在访问的第一天多次签到,不会重复计算。(当我发现可能的错误时,我实际上在编辑时添加了这部分。% w" x- _. O: y2 F4 B! g
编辑:我刚刚重新阅读了您对第一个问题的查询。您的查询将获得给定日期的登录次数,而不是日期计数。我想你想要这样的东西:
1 a7 l# B3 U0 l6 ^2 C1 n  y
    select count(distinct date(datetime))from checkinwhere user='some user' and city='some city'
    6 p  m8 [- p3 \6 A, I) g
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则