2015-02-06 178 views
0

我有一個旅行表,在trip.txnPNR中已完成旅程中有一個交易ID。優化mySQL LEFT JOIN

我有一個driver_contacts表,它引用了trip.id。

我必須找出是否有trip.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

第二個查詢是否可以解決問題,儘管存在密集性異議? – 2015-02-06 22:06:38

+0

@RobertHarvey - 第二個查詢使用非常少的資源,但返回不正確的數據。它從過去24小時返回已經有driver_contacts行的行程。 – jerrygarciuh 2015-02-06 22:07:43

+0

第一個查詢是昂貴但正確的。 – jerrygarciuh 2015-02-06 22:08:19

回答

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) != ''