这有点令人尴尬,这听起来很简单,但我只是没有得到它的解决方案(我甚至没有找到一个有意义的标题,如果它不适合我的问题,那就很抱歉)
想象我的两个表,其中我存储了所有用户信息和用户对我的系统的会话:
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。所以我很好奇你的专家有哪些解决方案。
我希望描述足够清楚。非常感谢您提前
答案 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)
。