2014-01-07 2 views
1

나는 groups, usersusers_groups 테이블을 가지고 있습니다. 사용자와 그룹 간의 관계는 여러면에서 많습니다. 사용자는 여러 그룹에 할당 될 수 있습니다. 나는 공통 user_id1과 user_id2 사이의 그룹 목록을 가져 오는 쿼리를 실행하고 싶습니다.SQL을 사용하여 공통 행 찾기

다음 쿼리를 생성했지만 시스템과 mysql 서버 (xampp)가 충돌하고 페이지로드가 영원히 걸립니다 (즉로드되지 않습니다).

왜 이런가요? users 테이블에는 약 6000 명의 테스트 사용자가 있고 groups 테이블에는 30 개의 그룹이 있고 users_groups 항목에는 70,000 명이 있습니다. 이 쿼리를 구성하는 더 좋은 방법이 있습니까?

$user_id1 = $this->db->escape($user_id1); 
    $user_id2 = $this->db->escape($user_id2); 
    $sql = "SELECT $select_string FROM users_groups 
       INNER JOIN groups ON groups.group_id = users_groups.ug_group_id 
       WHERE ug_group_id IN (SELECT ug_group_id FROM users_groups WHERE ug_user_id = $user_id2) 
       AND ug_user_id = $user_id1 LIMIT 10"; 

    $query = $this->db->query($sql); 

답변

2

사용 GROUP BY ... HAVING

이 시도 :

SELECT $select_string 
FROM users_groups ug 
INNER JOIN groups g ON g.group_id = ug.ug_group_id 
WHERE ug.ug_user_id IN ($user_id1, $user_id2) 
GROUP BY g.group_id HAVING COUNT(DISTINCT ug.ug_user_id) = 2 
LIMIT 10 
+0

감사합니다. 나는 ug_user_id 행의 4와 5 행 모두에서 ug_group_id를 변경해야만했습니다. 다시 한 번 감사드립니다! – emkay

+0

@emkay 당신이 가장 환영합니다 ... –