如何在sql查询中嵌套计数
我有以下两个问题 第一个列表列出了用户和上次登录日期,如下所示:如何在sql查询中嵌套计数,sql,Sql,我有以下两个问题 第一个列表列出了用户和上次登录日期,如下所示: iUserNum chDefaultLogin dateLastLogin -------- -------------- ------------- 17 fred.bloggs 01/06/2011 23 john.doe 13/05/2011 iUserNum chDefaultLogin dateLastLogin loginCount --------
iUserNum chDefaultLogin dateLastLogin
-------- -------------- -------------
17 fred.bloggs 01/06/2011
23 john.doe 13/05/2011
iUserNum chDefaultLogin dateLastLogin loginCount
-------- -------------- ------------- ----------
17 fred.bloggs 01/06/2011 12
23 john.doe 13/05/2011 4
使用以下查询
SELECT SDToken.iUserNum, chDefaultLogin, dateLastLogin
FROM SDUserScope JOIN SDToken ON SDUserScope.iUserNum = SDToken.iUserNum
第二个查询给出了用户在过去7天内使用此查询登录的次数(给定iUserNum用户编号)(在下面的示例中,我给出了iUserNum 17):
我要做的是将这两者连接在一起,因此我得到表中每个用户的计数,如下所示:
iUserNum chDefaultLogin dateLastLogin
-------- -------------- -------------
17 fred.bloggs 01/06/2011
23 john.doe 13/05/2011
iUserNum chDefaultLogin dateLastLogin loginCount
-------- -------------- ------------- ----------
17 fred.bloggs 01/06/2011 12
23 john.doe 13/05/2011 4
在MS Sql server/SYBASE中,将用户名作为公共密钥连接的2个子查询应该可以完成这项工作,如下所示,但任何其他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
)
在MS Sql server/SYBASE中,将用户名作为公共密钥连接的2个子查询应该可以完成这项工作,如下所示,但任何其他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
)
您是否尝试统一查询并仅添加分组依据
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
您是否尝试统一查询并仅添加分组依据
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
不幸的是,我在这里飞行有点盲目。这是在一个应用服务器(RSA)上,它有一个基本的查询编辑器来输入查询,但我不知道它在幕后运行的是什么。pl SQL、T-SQL和MySQl的不同之处在于,我认为它基于MS SQL,可能是SQL Express。(如果有帮助的话,肯定不是mySQL!)显然是:“RSA ACE/Server在关系数据库管理系统(RDBMS)中维护其数据。”不幸的是,我在这里有点盲目。这是在一个应用服务器(RSA)上,它有一个基本的查询编辑器来输入查询,但我不知道它在幕后运行的是什么。pl SQL、T-SQL和MySQl的不同之处在于,我认为它基于MS SQL,可能是SQL Express。(如果有帮助的话,肯定不是mySQL!)显然是:“RSA ACE/Server将其数据维护在一个Progress relational database management system(RDBMS)中。”“我认为这是99%——但是,我希望第二个查询中的iUserNum(当前设置为17)与该行用户的iUserNum匹配。这可能吗?等一下,我只是麻木了吗?我想我只需要从WHERE子句中删除SDToken.iUserNum行……您希望结果表中包含登录计数为零的用户吗?@Ben:我想您是对的,
iUserNum
上的过滤器应该被删除。@Walter Mitty-是的,我需要。我需要更改联接吗?我想这是99%——但是,我希望第二个查询中的iUserNum(当前设置为17)与该行上用户的iUserNum匹配。这可能吗?等一下,我只是麻木了吗?我想我只需要从WHERE子句中删除SDToken.iUserNum行……您希望结果表中包含登录计数为零的用户吗?@Ben:我想您是对的,iUserNum
上的过滤器应该被删除。@Walter Mitty-是的,我需要。我需要更改连接吗?