我有 3 个表。
support_works = 包含序列号
kickscooters = contian serial_number, kickscooter_id(作为主ID,命名ID)
租金 = 包含 kickscooter_id。
我正在尝试获取满足条件的 support_works 的 serial_number,然后将其与 kickscooter 的 serial_number 相匹配。然后获取它的 kickscooter_id 以获取所有与从中检索到的 kickscooter_id 匹配的租金。
目前:
select k.id
from support_works sw
join kickscooters k
on k.serial_number = sw.serial_number
where
sw.work_type = 'deploy' and
(sw.updated_at between '2019-11-01 02:00:00' and '2019-11-01 10:00:00') and
k.id in (select kcu.kickscooter_id
from kickscooter_control_units kcu
where kcu.particle_product_id in (9358, 9383)));
这非常适合从 kickscooter 表中获取 kickscooter_id。但我现在使用它作为子查询来获取所有租金表数据,其中 rents.kickscooter_id 在此子查询中:
select *
from rents r
where r.kickscooter_id
in (select k.id
from support_works sw
join kickscooters k
on k.serial_number = sw.serial_number
where
sw.work_type = 'deploy' and
(sw.updated_at between '2019-11-01 02:00:00' and '2019-11-01 10:00:00') and
k.id in (select kcu.kickscooter_id
from kickscooter_control_units kcu
where kcu.particle_product_id in (9358, 9383)));
这花费的时间太长,我想使用多个连接来加快速度。我该怎么做?
我一直在使用 CTE,但我读到它在创建/删除临时表时会占用内存,因此尽量避免使用它。
最佳答案
您可以在您的子查询
上加入kickscooter_control_units
,使用exists
关键字而不是IN。
select *
from rents r
where
exists
(select 1
from support_works sw
join kickscooters k on k.serial_number = sw.serial_number
join kickscooter_control_units kcu on kcu.kickscooter_id = k.id and kcu.particle_product_id in (9358, 9383)
where
sw.work_type = 'deploy' and
(sw.updated_at between '2019-11-01 02:00:00' and '2019-11-01 10:00:00'))
根据您的情况,您似乎正在过滤 ID
。 exists
仅适用于您要检查某个子查询
是否包含值的情况。
select *
from rents r
where
r.kickscooter_id in
(select k.id
from support_works sw
join kickscooters k on k.serial_number = sw.serial_number
join kickscooter_control_units kcu on kcu.kickscooter_id = k.id and kcu.particle_product_id in (9358, 9383)
where
sw.work_type = 'deploy' and
(sw.updated_at between '2019-11-01 02:00:00' and '2019-11-01 10:00:00'))
关于mysql - 使用查询的别名与另一个表 MySQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58810707/