2014-05-25 17 views
0

我有以下表SQL:获取隐含评级为用户项目列表

  • 用户表userid
  • 的项目表item,还与ID字段
  • 一表positiverating与字段customeriditemid如果用户给一个项目隐含正面评价(例如看到/买了/点击/ ...它)有条目

我想选择的领域user.iditem.idrating(布尔值字段),从而为每个用户和每个项目ratingtrue IIF存在于positiverating表和条目中另有false

的几点思考:

  • SELECT user.id, item.id from user, item结果所需要的交叉 产品。
  • positiveratings或多或少是这样的交叉乘积,但仅限于额定项

假设有10万项和用户的相同量,生成的查询需要是相当有效。我怀疑需要一些左/右连接,但我感觉有点卡住了。

更具体地说,我需要一个PostgreSQL查询。

回答

1

这是你在找什么?

select u.userid, i.itemid, (pr.itemid is not null) 
from user u cross join 
    item i left outer join 
    positiverating pr 
    on pr.userid = u.userid and pr.itemid = i.itemid; 

这里假设positiverating表中没有重复的用户/项目组合。

如果您有positiverating中的重复项,可以使用group by。不过,我会建议使用exists。我认为以下将起作用:

select u.userid, i.itemid, 
     exists (select 1 from postivierating where pr.userid = u.userid and pr.itemid = i.itemid) 
from user u cross join 
    item i; 
+0

看起来不错。如果有积极的重复呢?用户可以多次访问/购买物品。也许算了吗? – user3001