2015-01-07 1 views
3

Postgres에 문제가 있습니다. 다음의 예는 다음과 같습니다 내가 3 개 테이블을 가지고 : 사용자, 항목 및 상자공통 항목을 가진 사용자를 수집하는 sql 쿼리

상자 테이블이 상자 테이블을 감안할 때

user_id | item_id 
    1  |  3 
    1  |  4 
    1  |  6 
    1  |  7 
    2  |  5 
    2  |  10 
    2  |  11 
    3  |  5 
    3  |  6 
    3  |  7 

, 난 최소 2 그래서를 공유하는 사용자들 사이 항목을 검색하고 싶습니다 사용자 1과 사용자 3이 항목 6과 7을 공유하기 때문에 예상되는 SQL 쿼리 결과는 item_id : 6, 7 이어야합니다. 그러나 사용자 2와 3은 하나의 항목 만 공유합니다. 항목 5는 결과 5가 아닙니다.

저는 많은 성공을 거두고 있습니다. 나는 누군가가 나를 도울 수 있는지 궁금해.

+1

시도한 방식으로 다른 사람을 지정할 수 있습니까? –

+0

은 테이블을 기반으로 원하는 결과를 제시해주십시오 ** 상자 ** – twyly

+2

SELECT는 COUNT는 (boxes.item_id)> =이 원하는 결과에 대한 – stacker

답변

2

시도해보십시오. 6과 7을 반환합니다 (레코드 1,5를 추가하면 5,6,7).하지만 광범위하게 테스트하지는 않았습니다.

-- The Outer query gets all the item_ids matching the user_ids returned from the subquery  
SELECT DISTINCT c.item_id FROM boxes c -- need DISTINCT because we get 1,3 and 3,1... 
    INNER JOIN boxes d ON c.item_id = d.item_id 
    INNER JOIN 
     --- the subquery gets all the combinations of user ids which have more than one shared item_id 
     (SELECT a.user_id as first_user,b.user_id as second_user FROM 
     boxes a 
     INNER JOIN boxes b ON a.item_id = b.item_id AND a.user_id <> b.user_id -- don't count items where the user_id is the same! Could just make the having clause be > 2 but this way is clearer 
     GROUP BY a.user_id,b.user_id 
     HAVING count(*) > 1) s 
    ON s.first_user = c.user_id AND s.second_user = d.user_id 
+0

도와 줘서 고마워! 나는 이것을 시도 할 것이다 – stacker

+0

나는 당신의 솔루션 mlinth를 시도했다. http://sqlfiddle.com/#!15/0869ab/1, 그것이 작동하고있는 것처럼 보인다. 나는 더 복잡한 데이터로 시도 할 것이다. – stacker

관련 문제