首页 > 解决方案 > 使用查询的别名与另一个表 MySQL 连接

问题描述

我有 3 张桌子。

support_works = 包含
序列号 kickscooters = contian 序列号,kickscooter_id(作为主要 id 和命名 id)
租金 = 包含 kickscooter_id。

我正在尝试获取满足条件的 support_works 的序列号,然后将其与 kickscooter 的序列号匹配。然后获取它的 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,但是我读到它在创建/删除临时表时会占用内存,因此试图避免它。

标签: mysql

解决方案


您可以加入kickscooter_control_unitssubquery的 useexists关键字而不是 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'))  

似乎根据您正在过滤的场景IDexists仅当您想检查某些是否subquery包含值时才适用。

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

推荐阅读