2012-02-07 68 views
2

獲得最受歡迎的物品相對容易。但讓我們說我有一個兩列的表:item_idviewer_idmysql - 查詢獲取用戶未見過的最受歡迎物品

給定一個viewer_id,我想獲取頂部X個item_id行,這些行已被查看過最多次並且沒有被給定的viewer_id查看。因此,例如:

item_id | viewer_id 
    A | 1 
    A | 3 
    C | 2 
    C | 3 
    C | 4 
    D | 5 

獲得不被觀察者2應該給回一個看到最流行的項目,D.

什麼是去了解這個好辦法?

+0

您希望在此表中有多少行?直接查詢可能不是最好的選擇。瞭解問題的大小會有所幫助。對於小型網站,簡單的查詢應該可以正常工作。對於一個更大的網站,... – TheJacobTaylor 2012-02-07 06:09:13

+0

嘿dhruvg,記住如果你的問題已經回答,那麼你應該選擇一個答案 – 2012-02-07 21:12:40

回答

0

類似下面應該工作:

SELECT t.item_id, COUNT(t.viewer_id) AS view_count FROM table t 
WHERE t.item_id NOT IN (SELECT DISTINCT item_id FROM table t2 WHERE viewer_id = your_viewer_id) 
GROUP BY item_id 
ORDER BY view_count DESC 
+1

它看起來像你的過濾器是在錯誤的地方。內部查詢應該只包含該用戶已經查看的item_ids,對嗎? – TheJacobTaylor 2012-02-07 06:13:23

+0

@TheJacobTaylor - 你是對的 - 我更正了查詢 – 2012-02-07 08:14:26

0

試試這個:

select item_id, count(*) as timesViewed from t2 
where item_id not in (
    select distinct t1.item_id from t1 
    where viewer_id = 2 
) 
group by item_id 
order by timesViewed desc 

工作example

0

據我所知,你不只是希望他們列出,但下令從最給最不受歡迎;這應該工作。

SELECT item_id 
FROM table_name a 
WHERE NOT EXISTS 
(
    SELECT viewer_id FROM table_name t 
    WHERE a.item_id=t.item_id AND t.viewer_id=2 
) 
GROUP BY item_id 
ORDER BY COUNT(item_id) DESC;