2014-05-25 18 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