2015-02-06 2 views
0

trips.txnPNR에 완료된 여행의 트랜잭션 ID가있는 여행 테이블이 있습니다.mySQL 최적화 LEFT JOIN

trips.id를 참조하는 driver_contacts 테이블이 있습니다.

Trips.txnPNR이 설정되었지만 driver_contacts.trip에서 해당 ID를 가진 행으로 표시되지 않는 여행이 있는지 알아야합니다.

나는이 JOIN으로이 여행을 성공적으로 찾고 있지만 분명히 매우 많은 메모리를 소비합니다.

SELECT 
trips.id, 
driver_contacts.trip 
FROM trips 
LEFT JOIN driver_contacts ON trips.id = driver_contacts.trip WHERE trips.`tripDropoff` > '2014-10-24 15:15:25' 
AND driver_contacts.trip IS NULL 
AND TRIM(trips.txnPNR) != '' 

내 동료

SELECT 
24hourTrips.id, 
driver_contacts_null.trip 
FROM (SELECT id,txnPNR FROM trips WHERE trips.`tripDropoff` > now() - INTERVAL 1 DAY AND 
TRIM(txnPNR) != '') AS 24hourTrips 
LEFT JOIN (SELECT * FROM driver_contacts where driver_contacts.trip IS NULL) AS driver_contacts_null ON 24hourTrips.id = driver_contacts_null.trip 

훨씬 빠른에 변화를 추천하지만, 그 쿼리는 상관없이 driver_contacts의 행이 있는지의 모든 여행을 가져옵니다.

id가 driver_contacts.trip에없는 모든 출장 행에 대해 덜 집중적 인 조회는 어떻게됩니까?

+0

강렬한 반대에도 불구하고 두 번째 쿼리가 문제를 해결합니까? –

+0

@RobertHarvey - 두 번째 쿼리는 리소스를 거의 사용하지 않지만 잘못된 데이터를 반환합니다. 이미 driver_contacts 행이있는 지난 24 시간의 여행을 반환합니다. – jerrygarciuh

+0

첫 번째 쿼리는 비용이 많이 들지만 정확합니다. – jerrygarciuh

답변

0

해결책을 찾았습니다! 모든 사람이 행복해 지도록 잠시 후 돌아옵니다.

SELECT 
24hourTrips.id, 
driver_contacts.trip 
FROM (SELECT id,txnPNR FROM trips WHERE trips.`tripDropoff` > now() - INTERVAL 1 DAY AND 
TRIM(txnPNR) != '') AS 24hourTrips 
LEFT OUTER JOIN driver_contacts ON 24hourTrips.id = driver_contacts.trip WHERE driver_contacts.trip IS NULL AND TRIM(24hourTrips.txnPNR) != ''