0

这有点尴尬,听起来我想要的很容易,但我只是没有找到解决方案(而且我什至没有找到有意义的标题,如果它不适合我的问题,很抱歉)

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

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。所以我很好奇您的专家对此有什么解决方案。

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

4

1 回答 1

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 的(您需要从日期 LoginDate 中删除 Time)

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)用类似的东西替换。

于 2013-08-28T09:09:59.647 回答