mysql - 使用查询的别名与另一个表 MySQL 连接

标签 mysql

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

根据您的情况,您似乎正在过滤 IDexists 仅适用于您要检查某个子查询 是否包含值的情况。

 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/

相关文章:

mysql - mysql中是否有机制来限制基于任意值的INSERT

mysql - mysql中如何计算单列多行之和

php - 带有 PDO 下拉列表的 undefined variable

使用 Auto_Increment=1 导出 Mysql

php - 如何从 mysql select 为每条记录呈现不同的标记?

PHP 禁用远程站点获取我的内容

php - 如何从传入的 url 中获取 Id 值?

mysql - 错误号 1045 : While trying to connect to MySql

Mysql 选择 N 个重复项,省略 1 个重复项

mysql - Laravel 从更新查询中获取记录 ID