1

这是我的查询:

Select COUNT(*) 
From 
    Users u
    Inner Join 
    UsersLoginHistory uh On u.UserID = uh.UserID 
Where 
    1 = 1   
    And 
    u.AccountID = 37 
Group By u.UserID

我希望能够得到的是Count(*)应该在对 u.UserId 进行分组后返回一个数字。但它返回Count(*)分组依据之前的值。

所以我可以将上面的查询重写为:

Select COUNT(*)
From (
    Select   u.Username   
    From 
        Users u
        Inner Join 
        UsersLoginHistory uh On u.UserID = uh.UserID 
    Where 
        1 = 1   
        And 
        u.AccountID = 37 
    Group By u.UserID
) v

但是我需要找出为什么Count(*)在进行分组之前返回记录以及如何修复第一个查询本身。

编辑:样本记录

用户表

UserId     Username
102        tom.kaufmann

UserLoginHistory 表

UsersLoginHistoryID UserID  LoginDateTime         LogoutDateTime         IPAddress
1                    102    2012-09-28 01:16:00 NULL                 115.118.71.248
2                    102    2012-09-28 01:29:00 2012-09-28 01:29:00  127.0.0.1
3                    102    2012-09-28 01:32:00 2012-09-28 01:32:00  127.0.0.1
4                    102    2012-09-28 01:41:00 NULL                 115.118.71.248
5                    102    2012-09-28 01:43:00 2012-09-28 07:04:00  115.118.71.248  

等等..

尚未在此数据库中写入每条记录。

4

5 回答 5

2

根据您所说的第二个查询返回所需的结果(并假设UserID是 PK Users)我认为这就是您所需要的

SELECT Count(UserID)
FROM   Users u
WHERE  u.AccountID = 37
       AND EXISTS (SELECT *
                   FROM   UsersLoginHistory uh
                   WHERE  u.UserID = uh.UserID)

这将比展开所有连接的行然后再次折叠它们Group By u.UserID并计算结果的行数更有效。

于 2012-09-28T13:59:15.733 回答
1

将第一行更改为:

Select COUNT(*), u.UserID
于 2012-09-28T13:55:18.530 回答
0

这应该为您提供 UserIds 列表和 UsersLoginHistory 表中的条目计数。

SELECT u.UserId
, COUNT(uh.*)
FROM Users u
INNER JOIN UsersLoginHistory uh ON u.UserID = uh.UserID
WHERE u.AccountID = 37
GROUP BY u.UserID
于 2012-09-28T13:58:54.867 回答
0

但我需要找出为什么 Count(*) 在进行分组之前返回记录以及如何修复第一个查询本身

它正在计算每个用户 ID(登录次数)的行数,这正是group by应该如何工作的。

于 2012-09-28T14:17:05.257 回答
0

COUNT 是一个聚合函数,它应该是这样工作的。你得到每个分组的计数。

在您的第一个查询中,您正在查询每个用户的 userloginhistory 数。在您的第二个查询中,您正在查询具有登录历史记录的用户数。

http://msdn.microsoft.com/en-us/library/ms173454.aspx

于 2012-09-28T14:27:02.513 回答