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& {