用户去过这个城市的天数是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 _