2013-08-28 20 views
0

這有點令人尷尬,這聽起來很容易我想要的,但我只是沒有得到它的解決方案(而且我沒有找到一個有意義的標題,所以很抱歉,如果它不適合我的問題)SQL選擇UserIds並在兩天內登錄

想象中,我存儲所有用戶的相關信息我的兩個表和用戶與我的系統的會話:

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

我想是的唯一用戶ID的其中有一個列表昨天和今天至少舉行一次會議(例如2013-08-26和2013-08-27)。事情是,用戶每天可以有多個會話,我不想在結果中使用多個用戶標識。我嘗試了很多東西,但我認爲我只是不夠專業而已。

我的問題是要了解如何根據userid和date_yesterday和date_today比較兩行後選擇用戶標識。所以我很好奇你的專家有哪些解決方案。

我希望描述足夠清楚。非常感謝你提前

+0

詳細說明你的表的模式。 – Sasidharan

+0

你正在使用哪些DBMS? – GarethD

回答

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脫模時間)

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)