2013-02-27 6 views
0

이 SQL 쿼리를 작성하여 초대 테이블에없는 사용자의 친구를 얻습니다. 그러나 작동합니다. 그러나 하위 쿼리는 성능을 높이는 사람이고 나는별로 좋지 않습니다. 조인, 그냥 조인이 쿼리를 수정하기위한 모든 도움은 정말 감사하겠습니다. 여기 SQL 조인 및 하위 쿼리, SQL에 대한 하위 쿼리 조인

는 테이블 구조

어떤 도움이 정말이에 대한 LEFT JOIN을 사용할 수 있습니다
+1

성능에 대한 질문이 있으면 사용중인 RDBMS에도 태그를 추가해야합니다 (예 : Oracle, SQL Server, MySQL). SQL은 선언적입니다. 최적화 방법은 사용중인 제품에 따라 다릅니다. –

+0

JOIN을 반드시 하위 선택으로 다시 쓸 수있는 것은 아닙니다. 그리고 성능을 향상시킬 것이라고 생각하면 괜찮은 Optimizer를 사용하는 DBMS가 자동으로이를 수행합니다. –

+0

@a_horse_with_no_name MySQL을 사용하고 있습니까? – Sedz

답변

0

을 이해할 수있을 것이다
friends 
id   first_name 

friends_users 
id  friend_id  user_id 

friends_invitations 
id  friend_id user_id 

,

SQL 쿼리 여기

SELECT friend.id, 
     friend.first_name 
FROM friends AS friend 
     INNER JOIN friends_users AS friendsUser 
     ON (friend.id = friendsUser.friend_id 
       AND friend.id NOT IN (SELECT friend_id 
            FROM friends_invitations 
            WHERE friends_invitations.user_id = 1)) 
ORDER BY friendsUser.id ASC 
입니다
SELECT friend.id, 
     friend.first_name 
FROM friends AS friend 
     INNER JOIN friends_users AS friendsUser 
      ON friend.id = friendsUser.friend_id 
     LEFT JOIN friends_invitations 
      ON friend.id = friends_invitations.friend_id AND 
       friends_invitations.user_id = 1 
WHERE friends_invitations.friend_id IS NULL 
ORDER BY friendsUser.id ASC 
+0

을 선택하고 검색을 수행하는 열에 인덱스를 올바르게 정의한 경우 성능은 – Sedz

+0

입니다. 그러면 걱정할 필요가 없습니다. 'LEFT JOIN/IS NULL과 NOT EXISTS는 의미 상 동등하지만 NOT IN은 없습니다.' –

+0

그것은 작동하지 않습니다 – Sedz

1

하위 쿼리가 반드시 성능을 높일 수있는 것은 아니지만 쿼리에 성능 문제가 있습니까? (SQL Server 용) NOT IN, LEFT JOINNOT EXISTS의 차이점을 설명

SELECT friend.id, 
     friend.first_name 
FROM friends AS friend 
INNER JOIN friends_users AS friendsUser 
    ON friend.id = friendsUser.friend_id 
WHERE NOT EXISTS (SELECT 1 FROM friends_invitations 
        WHERE friends_invitations.user_id = 1 
        AND friend_id = friend.id) 
ORDER BY friendsUser.id ASC 

Here is a link : 어쨌든, 대부분의 시간 조회를 할 수있는 가장 빠른 방법은 NOT EXISTS을 사용하는 것입니다. 따라서이 다양한 옵션을 테스트하고 테이블에 적합한 옵션을 선택하십시오.