mysql - 优化 mySQL LEFT JOIN

标签 mysql join

我有一个行程表,其中已完成的行程在 trips.txnPNR 中有一个交易 ID。

我有一个引用 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 中的所有行程行进行不太密集的查找会怎样?

最佳答案

找到解决办法了!不到一秒就返回,所以每个人都很高兴。

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

关于mysql - 优化 mySQL LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28375611/

相关文章:

MySQL 无法选择特定字段值?

php - MYSQL HAVING 是否有替代方案

mysql - 返回 mysqlconnection 的函数

MySQL 连接两个仅部分匹配的表

sql - 合并 NULL 的表

join - Amazon Redshift - 默认加入是什么?

mysql - 错误的数据库查询设计指南

PHP 将 Unix 时间转换为 ISO 并减去一个小时

mySQL LEFT JOIN 只有当

php - 检查2个表中是否存在数据