2012-02-07 5 views
2

最も人気のあるアイテムを取得することは比較的簡単です。しかし、私は2つの列:item_idviewer_idを持つテーブルがあるとしましょう。mysql - ユーザが見たことのない最も人気のあるアイテムを取得するためのクエリ

与えられたviewer_idが与えられているので、私はMOST時間で見られ、与えられたviewer_idで見られなかったトップのXのitem_id行をフェッチしたいと思います。ですから、例えば:

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

これについて移動する良い方法は何ですかD.

をAに戻って与える必要がありビューワ2で見ていない最も人気のある商品を取得しますか?以下のような

+0

この表にはいくつの行がありますか?まっすぐなクエリが最善の方法ではないかもしれません。問題の大きさを知ることは助けになります。小さなWebサイトの場合、まっすぐ進むクエリはうまくいくはずです。大きなサイトの場合は... – TheJacobTaylor

+0

質問が回答された場合は、回答を選択してください。 –

答えて

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

+0

@TheJacobTaylor - あなたが正しい - 私はクエリを修正した –

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; 
関連する問題