基于SQL的协同过滤推荐系统求助:查询返回空结果
问题原因
原查询返回空结果的核心问题是JOIN逻辑矛盾:
- 你指定
t2.ProductId必须是用户1没评分过的产品(当前只有1005符合) - 同时要求
t1.ProductId = t2.ProductId,但t1是用户1的评分记录,用户1根本没有1005的评分,所以t1和t2之间没有任何匹配行,最终无结果。
另外,把t1.UserId = 1写在JOIN的ON子句里属于逻辑错误,应该提前过滤用户1的数据,而非在关联时限制。
调整思路
你的需求应该是给用户1推荐:其他用户(2、3、4)评分过,但用户1没评分过的产品,且满足平均评分≥3、至少3个用户评分。但当前数据里,用户1没看过的产品只有1005,而只有用户2、4给它评过分,不满足「至少3个用户」的条件,这也是无结果的原因之一。
修正后的SQL
如果坚持原条件,修正逻辑后的代码如下(逻辑正确,但当前数据仍无结果):
SELECT ProductId FROM TestTable WHERE UserId IN (2, 3, 4) AND ProductId NOT IN ( SELECT ProductId FROM TestTable WHERE UserId = 1 ) GROUP BY ProductId HAVING AVG(Rating) >= 3 AND COUNT(DISTINCT UserId) >= 3;
如果想适配当前数据得到结果,可以把用户数量条件调整为≥2:
SELECT ProductId FROM TestTable WHERE UserId IN (2, 3, 4) AND ProductId NOT IN ( SELECT ProductId FROM TestTable WHERE UserId = 1 ) GROUP BY ProductId HAVING AVG(Rating) >= 3 AND COUNT(DISTINCT UserId) >= 2;
执行这段代码会返回1005,符合推荐逻辑。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

