SQL选择在两天内登录的用户

时间:2013-08-28 09:01:58

标签: sql

这有点令人尴尬,这听起来很简单,但我只是没有得到它的解决方案(我甚至没有找到一个有意义的标题,如果它不适合我的问题,那就很抱歉)

想象我的两个表,其中我存储了所有用户信息和用户对我的系统的会话:

table.users (UID, RegisteredAt, gender, locale, ...)
table.sessions (SID, UserId, LoginDate, ...)

我想要的是一个唯一用户ID的列表,该列表昨天和今天至少有一个会话(例如2013-08-26和2013-08-27)。问题是,用户每天可以有多个会话,我不希望在我的结果中有多个用户ID。我尝试了很多东西,但我认为我不够专业,无法完成任务。

我的问题是要了解如何根据userid和date_yesterday以及date_today比较两行后选择用户ID。所以我很好奇你的专家有哪些解决方案。

我希望描述足够清楚。非常感谢您提前

1 个答案:

答案 0 :(得分:1)

您可以按如下方式使用EXISTS(每个子查询确保登录一天):

SELECT  *
FROM    Users u
WHERE   EXISTS 
        (   SELECT  1 
            FROM    sessions s 
            WHERE   s.UserID = u.UID 
            AND     s.LoginDate >= '20130826' 
            AND     s.LoginDate < '20130827'
        )
AND     EXISTS 
        (   SELECT  1 
            FROM    sessions s 
            WHERE   s.UserID = u.UID 
            AND     s.LoginDate >= '20130827' 
            AND     s.LoginDate < '20130828'
        );

或者你可以使用GROUP BY / HAVING,虽然确切的解决方案将是DBMS特定的(你需要从DateDate的日期剥离时间)

SELECT  u.*
FROM    Users u
        INNER JOIN
        (   SELECT  s.UserID
            FROM    Sessions s
            WHERE   s.LoginDate >= '20130826'
            AND     s.LoginDate < '20130828'
            GROUP BY s.UserID
            HAVING COUNT(DISTINCT CAST(s.LoginDate AS DATE)) = 2 -- 2 DISTINCT LOGIN DATES
        ) s
            ON s.UserID = u.UID;

根据您的DBMS,您可能需要用类似的东西替换CAST(s.LoginDate AS DATE)