Использование псевдонима запроса для объединения с другой таблицей MySQL - PullRequest
1 голос
/ 12 ноября 2019

У меня есть 3 таблицы.

support_works = содержать серийный номер
kickscooters = contian serial_number, kickscooter_id (в качестве основного идентификатора и именованного идентификатора)
rents = содержать kickscooter_id.

Я пытаюсь получить serial_number support_works, который удовлетворяет условиям, а затем сопоставить его с serial_number 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_id из таблицы kickscooter. Но сейчас я использую это как подзапрос, чтобы получить все данные таблицы аренды, где 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, однако я прочитал, что он занимает память при создании / удалении временной таблицы, поэтому попытался избежать этого.

1 Ответ

1 голос
/ 12 ноября 2019

Вы можете присоединиться к kickscooter_control_units для своего subquery ключевого слова use 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 применимо, только если вы хотите проверить, содержит ли определенный 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'))  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...