如何统计同时参与两个ObjectID的唯一用户数?现有SQL无结果排查
问题分析与解决
原SQL的错误点
- JOIN语法错误:
LEFT JOIN后面缺少ON关键字,正确的关联语法应该是LEFT JOIN Engagements ON Engagements.UserID = Users.UserID - 条件逻辑错误:你要筛选的是
ObjectID为10和11的记录,但误写成了UserID;同时,同一行的字段不可能同时等于两个不同值(Engagements.UserID = '10' AND Engagements.UserID = '11'),这直接导致查询无结果。
正确的SQL写法
写法一:分组统计法(推荐)
这种方式通过分组筛选出同时关联两个ObjectID的用户,还能直接统计数量:
-- 查看符合条件的用户ID SELECT u.UserID FROM Users u INNER JOIN Engagements e ON e.UserID = u.UserID WHERE e.ObjectID IN (10, 11) GROUP BY u.UserID HAVING COUNT(DISTINCT e.ObjectID) = 2; -- 统计符合条件的用户数量 SELECT COUNT(DISTINCT u.UserID) AS TargetUserCount FROM Users u INNER JOIN Engagements e ON e.UserID = u.UserID WHERE e.ObjectID IN (10, 11) GROUP BY u.UserID HAVING COUNT(DISTINCT e.ObjectID) = 2;
逻辑说明:先关联用户表和互动表,筛选出互动对象为10或11的记录;按用户ID分组后,统计每个用户关联的不同ObjectID数量,只有数量等于2的用户才是同时和两个对象互动的。
写法二:EXISTS子查询法
通过两次子查询验证用户是否同时存在两个互动记录:
-- 查看符合条件的用户ID SELECT DISTINCT u.UserID FROM Users u WHERE EXISTS ( SELECT 1 FROM Engagements e1 WHERE e1.UserID = u.UserID AND e1.ObjectID = 10 ) AND EXISTS ( SELECT 1 FROM Engagements e2 WHERE e2.UserID = u.UserID AND e2.ObjectID = 11 ); -- 统计符合条件的用户数量 SELECT COUNT(DISTINCT u.UserID) AS TargetUserCount FROM Users u WHERE EXISTS ( SELECT 1 FROM Engagements e1 WHERE e1.UserID = u.UserID AND e1.ObjectID = 10 ) AND EXISTS ( SELECT 1 FROM Engagements e2 WHERE e2.UserID = u.UserID AND e2.ObjectID = 11 );
逻辑说明:分别检查用户是否存在和ObjectID=10、ObjectID=11的互动记录,同时满足两个条件的用户即为目标用户。
内容的提问来源于stack exchange,提问作者Loz
相关产品推荐
相关产品推荐

