如何在sql查询中嵌套计数

时间:2011-06-17 10:19:50

标签: sql

我有以下两个问题。

第一个列出用户和上次登录日期如下:

iUserNum  chDefaultLogin  dateLastLogin
--------  --------------  -------------
17        fred.bloggs     01/06/2011
23        john.doe        13/05/2011

使用以下查询

SELECT SDToken.iUserNum, chDefaultLogin, dateLastLogin
FROM SDUserScope JOIN SDToken ON SDUserScope.iUserNum = SDToken.iUserNum

第二个使用此查询计算用户在过去7天内登录的次数(给定iUserNum用户编号)(在下面的示例中,我给出的iUserNum为17):

SELECT COUNT(*) FROM SDToken 
   JOIN SDLogEntry ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum 
   JOIN SDUserScope ON SDToken.iUserNum = SDUserScope.iUserNum 
   JOIN SDLogMessage ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum 
   WHERE SDToken.iUserNum = 17 AND SDUserScope.iSiteNum = iMySite
     AND SDLogEntry.dtGMTDate > GMTDateNow - 7

我想要做的就是将两者结合在一起,所以我得到了表中每个用户的计数,如下所示:

iUserNum  chDefaultLogin  dateLastLogin  loginCount
--------  --------------  -------------  ----------
17        fred.bloggs     01/06/2011     12
23        john.doe        13/05/2011     4

2 个答案:

答案 0 :(得分:1)

您是否尝试统一查询并只添加分组?

SELECT  SDToken.iUserNum, 
        chDefaultLogin, 
        dateLastLogin,
        COUNT(*) AS loginCount
FROM SDUserScope 
    INNER JOIN SDToken 
        ON SDUserScope.iUserNum = SDToken.iUserNum
            INNER JOIN SDLogEntry 
                ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum 
                    INNER JOIN SDLogMessage 
                        ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum 
WHERE   SDToken.iUserNum = 17 
AND     SDUserScope.iSiteNum = iMySite 
AND     SDLogEntry.dtGMTDate > GMTDateNow - 7
GROUP BY    SDToken.iUserNum, 
            chDefaultLogin, 
            dateLastLogin

答案 1 :(得分:0)

作为公共密钥加入用户名的2个子查询应该在MS Sql server / SYBASE中完成它的工作,它会像下面一样,但任何其他RDBMS你可以使用2个子查询应用相同的逻辑...语法可能有点不同点

Select A.SDToken.iUserNem, A.chDefaultLogin, A.dateLastLoginm,B.logincount
    FROM 
    (
        (SELECT SDToken.iUserNem, chDefaultLogin, dateLastLogin FROM SDUserScope JOIN SDToken ON SDUserScope.iUserNum = SDToken.iUserNum )A
        INNER JOIN 
        (SELECT COUNT(*)logincount,SDToken.iUserNem FROM SDToken    
         JOIN SDLogEntry ON SDLogEntry.chTokenSerialNum = SDToken.chSerialNum    
         JOIN SDUserScope ON SDToken.iUserNum = SDUserScope.iUserNum    
         JOIN SDLogMessage ON SDLogEntry.iMessageNum = SDLogMessage.iMessageNum    
         WHERE SDToken.iUserNum = 17 AND SDUserScope.iSiteNum = iMySite AND SDLogEntry.dtGMTDate > GMTDateNow - 7 
         GROUP BY SDToken.iUserNem)B
         ON A.iUserNem = B.iUserNem
    )