2012-04-26 4 views
0

에 의해 영감을 받았습니다. this article 데이터베이스에서 멤버 목록의 내보내기 기능을 최적화하려고했습니다.여러 테이블에 조인 하시겠습니까?

원래 쿼리는 다음과 같다 :

-- First query 
SELECT 
    * 
FROM 
    members_customer_id_0000000169 
WHERE 
    deleted = '0000-00-00 00:00:00' 

-- Second query run for every result from first query 
SELECT 
    stores.external_store_id AS local_store_id 
FROM 
    regions, 
    stores, 
    stores_reference_members_customer_id_0000000169 
WHERE 
    regions.customer_id = 169 
AND 
    stores.region_id = regions.id 
AND 
    stores_reference_members_customer_id_0000000169.member_id =' . $result['id'] . ' 
AND 
    stores_reference_members_customer_id_0000000169.store_id = stores.id 

첫 번째 쿼리는 180K 행을 반환하고 그 성능은 두 번째 쿼리는 모든 180K 시간을 가져 효율적이지 않습니다.

내가 대신이 일을 시도 :

SELECT 
    members_customer_id_0000000169.*, 
    stores.external_store_id AS local_store_id 
FROM 
    members_customer_id_0000000169 
LEFT JOIN 
    stores_reference_members_customer_id_0000000169 
ON 
    stores_reference_members_customer_id_0000000169.member_id = members_customer_id_0000000169.id 
JOIN 
    regions 
JOIN 
    stores 
WHERE 
    members_customer_id_0000000169.deleted = '0000-00-00 00:00:00' 
AND 
    regions.customer_id = 169 
AND 
    stores.region_id = regions.id 
AND 
    stores_reference_members_customer_id_0000000169.store_id = stores.id 

결과는 140K 행입니다. 이유는 내가 의도 한대로 local_store_id이없는 회원을 얻지 못했기 때문일 수 있습니다. 그리고 문제가 무엇인지 확신 할 수 없습니다.

많은 테이블과 WHERE 절이 있기 때문에 조인에 문제가 있다고 확신하지만 두 테이블 간의 LEFT/RIGHT 조인 만 해본 경험이 있습니다.

누구든지 문제를 식별 할 수 있습니까?

답변

1

각 JOIN 작업에는 SQL에 새 테이블의 레코드를 병합하는 방법을 알리는 해당 ON 문이 있어야합니다. 문제를 일으킬 수있는 WHERE 문에서 일부 논리를 수행하는 것처럼 보입니다.

또한 local_store_id가없는 멤버를 얻는 한 사실상 상점에서 내부 조인을 수행하므로 조인 논리를 기반으로 상점에 해당 행이있는 멤버 만 결과 집합에 포함될 수 있습니다. 왼쪽 외부 조인은 당신이 찾고있는 것을 줄 수 있습니다.

+0

'LEFT JOIN'을 'LEFT OUTER JOIN'으로 변경하면 같은 결과가 나타납니다. WHERE 절을 조인으로 옮기는 것은 불가능 해 보입니다. 적어도이 작업을 수행하는 방법에 대해서는 전혀 모릅니다. – Repox

+0

글쎄, 마지막으로 WHERE 절을 조인으로 옮기면 필요한 결과를 얻었습니다. 고맙습니다. – Repox

관련 문제