2012-02-07 3 views
2

가장 인기있는 항목을 얻는 것은 상대적으로 쉽습니다. 하지만 두 개의 열이있는 표가 있다고 가정 해 보겠습니다. item_idviewer_id입니다.mysql - 사용자가 보지 못했던 가장 인기있는 항목을 가져 오는 쿼리

viewer_id이 주어 졌으므로 가장 많이 보았고 주어진 viewer_id에 의해 보지 않은 최상위 X item_id 행을 가져 오려고합니다. 그래서 예를 들면 :

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

,

이것에 대해 갈 수있는 좋은 방법은 무엇입니까 D.

을를 다시 제공해야 뷰어 2에서 볼 수없는 가장 인기있는 아이템을 얻기? 다음과 같은

+0

이 테이블에 몇 개의 행이 있습니까? 직선 질의가 최선의 방법은 아닐 수도 있습니다. 문제의 크기에 대한 아이디어가 있으면 도움이 될 것입니다. 소규모 웹 사이트의 경우 간단한 쿼리 만 제대로 작동합니다. 큰 사이트의 경우 ... – TheJacobTaylor

+0

안녕하세요 dhruvg, 귀하의 질문에 대답했다면, 다음 대답을 선택해야 기억하십시오 –

답변

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; 
관련 문제