【发布时间】:2016-10-24 04:56:43
【问题描述】:
我正在建立一个聊天网站并向观众展示聊天内容,我有 3 个下拉列表 - 体育(默认为所有体育)、日/月/年、在线用户/总用户。
现在,如果默认选择所有运动,我选择 1 个月和总用户,预期结果应该是
我的查询是
SELECT DISTINCT roo.[Sports],
roo.[Name],
COUNT(DISTINCT chu.ChatUserLogId) AS TotalUsers,
COUNT(DISTINCT liu.[LoggedInUserID]) AS UserOnline
FROM Room AS roo
LEFT JOIN LoggedInUser AS liu ON roo.RoomID = liu.RoomID
LEFT JOIN ChatUserLog AS chu ON roo.RoomID = chu.RoomID
AND chu.LoggedInTime >= DATEADD(DAY,-30,GETDATE())
GROUP BY roo.[Sports], roo.[Name]
ORDER BY TotalUsers DESC
有人建议用我的方法实际上是因为两个连接而将行相乘,所以我需要先聚合,然后再连接。
所以最后我也尝试了这个查询
with agg_ChatUserLog as (select RoomId, count(*) as cnt_user_tot from ChatUserLog WHERE LoggedInTime >= DATEADD(DAY,-30,GETDATE()) group by RoomId),
agg_LoggedInUser as (select RoomId, count(*) as cnt_user_logged from LoggedInUser group by RoomId)
select Sports, Name, cnt_user_tot, cnt_user_logged from Room r
left outer join agg_ChatUserLog acu on acu.RoomId = r.RoomId
left outer join agg_LoggedInUser alu on alu.RoomId = r.RoomId;
但这也使结果成倍增加。
我在两个查询中都犯了哪些错误?在此先感谢您,祝您有美好的一天。
样本数据是:
Chatroom name Total Users Online users
Basketball
Roomname27 32 5
Roomname11 15 3
Roomname32 8 1
Football
Roomname5 63 12
Roomname18 44 7
Roomname4 15 2
【问题讨论】:
-
第二种方法看起来不错。添加示例数据和我们将检查的第二个查询结果
-
在未发表评论的问题中
-
@Prdp 我已在问题中添加了示例供您参考。感谢并期待您的帮助。
-
这是样本输出。
-
我已经在问题本身的前面添加了所有表模式。你还需要什么吗?请告诉我您是否需要考虑第二个查询来解决此问题。谢谢
标签: sql sql-server join left-join