You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:37:27