2012-02-07 21 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;