mysql如何优化子查询

时间:2018-09-14 17:48:57

标签: mysql subquery

我有以下查询,从中可以得到预期的结果,问题是返回数据需要很长时间,我知道速度慢是由于下一行

(select fecha_hora 
 from horas
 where horas.consulta_id = consultas.id
 AND fecha_hora >= NOW() 
 AND horas.estado = 0
 ORDER BY fecha_hora limit 0, 1) as hora 

我不知道该怎么解决。

目标是获取最接近医生拥有的实际可用日期(有些医生没有空房)的日期和时间

select `medicos`.`id` as `med_id`
, `medicos`.`estado` as `med_estado`
, `medicos`.`descripcion`
, `clinicas`.`nombre` as `cli_nombre`
, `clinicas`.`direccion` as `cli_direccion`
, `regiones`.`nombre` as `region`
, `comunas`.`nombre` as `comuna`
, (select fecha_hora 
   from horas 
   where horas.consulta_id = consultas.id 
   AND fecha_hora >= NOW() 
   AND horas.estado = 0 
   ORDER BY fecha_hora 
   limit 0, 1) as hora
from `consultas` 
inner join `consulta_especialidad` 
 on `consulta_especialidad`.`consulta_id` = `consultas`.`id` 
inner join `especialidades` 
  on `especialidades`.`id` = `consulta_especialidad`.`especialidad_id` 
inner join `medicos` 
  on `medicos`.`id` = `consultas`.`medico_id` 
inner join `clinicas` 
  on `clinicas`.`id` = `consultas`.`clinica_id` 
inner join `regiones` 
  on `regiones`.`id` = `clinicas`.`region_id` 
inner join `comunas` on `comunas`.`id` = `clinicas`.`comuna_id` 
where `medicos`.`estado` != 5 
and `clinicas`.`region_id` = 15 
and `especialidades`.`id` = 116 
group by `medicos`.`id` 
order by `medicos`.`estado` desc
 , -`hora` desc, `medicos`.`nombres` asc
 , `medicos`.`apellidos` asc

1 个答案:

答案 0 :(得分:0)

不是答案。评论太久了...

FWIW,我觉得这更容易阅读...

SELECT m.id med_id
     , m.estado med_estado
     , m.nombre_completo med_nombre_completo
     , m.seguridad med_seguridad
     , m.foto_perfil med_foto_perfil
     , m.genero med_genero
     , m.descripcion
     , l.nombre cli_nombre
     , l.direccion cli_direccion
     , l.id cli_id
     , l.telefono cli_telefono
     , l.link_agenda cli_link_agenda
     , r.nombre region
     , c.nombre comuna
     , (SELECT fecha_hora 
          FROM horas h
         WHERE h.consulta_id = k.id 
           AND fecha_hora >= NOW() 
           AND h.estado = 0 
         ORDER 
            BY fecha_hora 
         LIMIT 0,1
       ) hora
  FROM consultas k
  JOIN consulta_especialidad ke 
    ON ke.consulta_id = k.id 
  JOIN especialidades e
    ON e.id = ke.especialidad_id 
  JOIN medicos m 
    ON m.id = k.medico_id 
  JOIN clinicas l
    ON l.id = k.clinica_id 
  JOIN regiones r
    ON r.id = l.region_id 
  JOIN comunas c 
    ON c.id = l.comuna_id 
 WHERE m.estado != 5 
   AND l.region_id = 15 
   AND e.id = 116 
 GROUP 
    BY m.id 
 ORDER 
    BY m.estado DESC
     , -hora DESC -- ISN'T THIS THE SAME AS ASC???
     , m.nombres ASC
     , m.apellidos ASC

观察:您有一个GROUP BY子句,但没有聚合函数。这是灾难的秘诀。