2014-01-24 87 views
0

我有2个表像这样:比较日期的子查询

USER 
ID_____LastLogin 
1------2013-12-19 
2------2013-11-12 
3------2013-09-14 
4------2013-07-18 
5------2013-06-13 

OTHER 
ID_____UserID___TimeStamp 
1------1--------2013-12-17 
2------2--------2013-10-11 
3------3--------2013-05-14 
4------4--------2013-02-18 

我试图让后,因为他们的“其他时间戳的” 90天即已经登录的用户的数量,如果他们在那个“其他”桌子。

期望的结果:

2 

期望的结果解释说:

UserID of '1' LastLogin is not greater than Other.TimeStamp (excluded in count) 
UserID of '2' LastLogin is not greater than Other.TimeStamp (excluded in count) 
UserID of '3' LastLogin is greater than Other.TimeStamp (included in count) 
UserID of '4' LastLogin is greater than Other.TimeStamp (included in count) 
UserID of '5' is not in Other table (excluded in count) 

我已经试过:

SELECT COUNT(DISTINCT(user.ID)) 
FROM user INNER JOIN other ON other.UserID = User.ID 
WHERE DATE(user.LastLogin) >= (
    SELECT (DATE(other.TimeStamp) + INTERVAL 90 DAY) 
    FROM other 
    GROUP BY other.UserID) 

我得到一个错误,指出:

"Subquery returns more than 1 row" 

我明白为什么错误显示(我比不上一个计数的子查询的次数多行),虽然我试图比较计数THOSE users.LastLogin对同一用户的other.TimeStamp

回答

3

为什么子查询呢?

SELECT COUNT(*) 
FROM user JOIN other ON other.UserID = user.ID 
WHERE user.LastLogin >= other.TimeStamp + INTERVAL 90 DAY 
+0

+1。 。 。这是更好的解决方案,因为它可以在日期时间列上使用索引。它确实假设'other'表每个'userid'只有一行,这似乎是基于这个问题的合理假设。 –

+0

有时我倾向于想想一个简单的查询:)谢谢 – Ken

+0

@GordonLinoff ..是否有一个函数可以在SQL Server中用来执行完全相同的操作。我用'datediff()'试过了,但正如你已经说过的那样,它没有利用索引。谢谢 –

0

SQLFiddle

可以使用DATEDIFF()功能:

SELECT COUNT(*) 
FROM user 
INNER JOIN other ON other.UserID = User.ID 
WHERE DATEDIFF(user.Lastlogin,other.TimeStamp)>90 
+0

好的解决方案,我认为也可以。尽管> =有效。你跳过子查询的想法也很好。谢谢。 – Ken