2012-06-06 2 views
0

두 사용자 간의 상호 접촉을 찾으려고합니다. 접점 테이블은 다음과 같이 설정 :도전적인 mysql INTERSECT 쿼리

userprofile_usercontact 
- first_user_id 
- second_user_id 
- mutual 

다음은 내가 달성하기 위해 노력하고있는 쿼리입니다 :

/* get the first user's contacts */ 
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 1 AND mutual = 1 
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 1 AND mutual = 1 
    *INTERSECT* 
/* get the second user's contacts */ 
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 37 AND mutual = 1 
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 37 AND mutual = 1 

내가 이것을 어떻게 달성 할 것인가?

답변

1

나는 상호 속성의 중요성을 이해하지 않는 - 하나 정도 (하지만 당신의 예제 코드에서 항상 1이기 때문에, 공통의 접점을 찾기 위해 seperation) $ user1과 $ user2 사이에 그것은 (내부) 데이터에 합류하는 것입니다.

SELECT user1_contacts.uid 
FROM 
(SELECT a.first_user_id as uid 
FROM userprofile_usercontact a 
WHERE a.second_user_id=$user1 
AND a.mutual=1 
UNION 
SELECT b.second_user_id 
FROM userprofile_usercontact b 
WHERE b.second_user_id=$user1 
AND b.mutual=1) as user1_contacts, 
(SELECT a.first_user_id as uid 
FROM userprofile_usercontact a 
WHERE a.second_user_id=$user2 
AND a.mutual=1 
UNION 
SELECT b.second_user_id 
FROM userprofile_usercontact b 
WHERE b.second_user_id=$user2 
AND b.mutual=1) as user2_contacts 
WHERE user1_contacts.uid=user2_contacts.uid 

효과적으로 당신이 가장 효율적인 해결책이 될 수 없습니다 (그러나와 'OR' 'IN'를 사용하는 것보다 훨씬 더 효율적입니다 병합 조인을 강요하고 있습니다.을 작성할 수 있습니다 모든 것은 중첩 된 조회를 사용하지만, 코드는 매우 지저분한 얻을 것이다.

당신이 seperation에의 한 정도를 넘어하려면

, 다음은 graph optimised DBMS

를 사용하는 많은 청소기 것
0

이 꽤 아니지만 작동합니다 :

SELECT * FROM userprofile_usercontact 
WHERE 
(
first_user_id IN 
(
/* get the first user's contacts */ 
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 1 AND mutual = 1 
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 1 AND mutual = 1 
) AND first_user_id IN (
/* get the second user's contacts */ 
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 37 AND mutual = 1 
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 37 AND mutual = 1 
) 
) OR (
second_user_id IN 
(
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 1 AND mutual = 1 
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 1 AND mutual = 1 
) AND second_user_id IN (
/* get the second user's contacts */ 
SELECT second_user_id FROM userprofile_usercontact WHERE first_user_id = 37 AND mutual = 1 
    UNION 
SELECT first_user_id FROM userprofile_usercontact WHERE second_user_id = 37 AND mutual = 1 
) 
)