带有LEFT JOIN(SELECT)ORDER和LIMIT的MySQL查询

时间:2014-08-04 19:23:06

标签: mysql sql join sql-order-by limit

今天我需要这个非常长的选择查询的帮助。

问题是我需要从1个表“dispositivos”中获取所有记录,然后LEFT JOIN“monitoreo”,其他一些表格,此查询中最重要的部分是加入“incidencia”表。

一个“dispositivo”可以有许多“incidencia”,并且从所有“incidencia”我需要“alerta_id”列具有最低值的那个,“incidencia.fecha_incidente”=“monitoreo.fecha”和“ incidencia.fecha_correccion“是NULL。

现在,因为我只需要“incidencia”中的一条记录,所以我使用LIMIT。

但是我继续在控制台上打印结果,当我在“incidencia”的select查询中使用limit时,它会将5个来自它的列作为null,如果我不这样做,那么它实际上会带给我整个数据,但当然它重复了它找到的每个“incidencia”的“dispositivos”信息。

现在这是我的查询。如果有人能帮助我,我会很感激。 如果您对我的查询或我以前的文字一无所知,请不要犹豫。 顺便说一下,所有引号和加号都是因为查询是针对node.js项目的,我需要这样做才能更好地可视化我的代码。

SELECT d.id
     , d.tipo_dispositivo_id
     , d.unidad_adscripcion_id
     , d.nro_cns
     , d.cod_inter
     , d.nombre_senal
     , d.lat as lat_origen
     , d.long as long_origen
     , d.direccion_latitud_id
     , d.direccion_longitud_id
     , d.descripcion
     , d.alc
     , d.ele
     , d.cod_iala_id
     , d.sistema_acceso_id
     , d.color_bombillo_id
     , d.modelo_bombillo_id
     , d.cant_bateria
     , d.volt_grupo_bateria
     , d.nro_panel_solar
     , d.corriente_panel as cor_pan
     , d.forma_estructura
     , d.altura_torre
     , d.nro_telf
     , d.lat_gps
     , d.long_gps
     , d.activo
     , mon.tipo_evento_id
     , mon.fecha fecha_hora
     , mon.voltaje_pila
     , mon.voltaje_panel
     , mon.consumo_linterna
     , mon.corriente_panel
     , mon.estado
     , mon.temperatura
     , mon.gpsval
     , mon.lat lat_mon
     , mon.dlat
     , mon.long long_mon
     , mon.dlong
     , mon.velocidad
     , mon.rumbo
     , mon.dispositivo_id disp_check
     , i.*    
  FROM dispositivos d 
  LEFT 
  JOIN monitoreo_actual mon 
    ON mon.dispositivo_id = d.id 
  LEFT 
  JOIN 
     ( SELECT dispositivo_id disp_inc
            , alerta_id
            , fecha_incidente
            , hora
            , fecha_correccion 
         FROM incidencia inc 
        WHERE fecha_correccion IS NULL
        ORDER 
           BY alerta_id ASC LIMIT 1
     ) i
    ON i.disp_inc = d.id

4 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用内联视图,该视图返回您要返回的“incidencia”中行的唯一标识符,然后将其连接到inidencia表以获取行。

e.g。

LEFT
JOIN ( SELECT l.fecha_incidente
            , MIN(l.alerta_id) AS lowest_alerta_id
       FROM incidencia l
       WHERE l.fecha_correccion IS NULL
       GROUP BY l.fecha_incidente
     ) m
  ON m.fecha_incidente = monitoreo.fecha
LEFT JOIN incidencia n
       ON n.fecha_incidente  = m.fecha_incidente
      AND n.alerta_id        = m.lowest_alerta_id

答案 1 :(得分:0)

添加你的选择 分钟(alerta_id) 和 由alerta_id分组 最后

答案 2 :(得分:0)

您是否尝试过将第二个LEFT JOIN更改为JOIN?..听起来您不希望这些行与此部分不匹配。

答案 3 :(得分:0)

'SELECT d.id, d.tipo_dispositivo_id, d.unidad_adscripcion_id, d.nro_cns, d.cod_inter, d.nombre_senal, d.lat as lat_origen, d.long as long_origen, '+
                              'd.direccion_latitud_id, d.direccion_longitud_id, d.descripcion, d.alc, d.ele, d.cod_iala_id, d.sistema_acceso_id, d.color_bombillo_id, '+
                              'd.modelo_bombillo_id, d.cant_bateria, d.volt_grupo_bateria, d.nro_panel_solar, d.corriente_panel as cor_pan, d.forma_estructura, d.altura_torre, '+
                              'd.nro_telf, d.lat_gps, d.long_gps, d.activo, '+
                              'mon.tipo_evento_id, mon.fecha fecha_hora, mon.voltaje_pila, mon.voltaje_panel, mon.consumo_linterna, mon.corriente_panel, mon.estado, '+
                              'mon.temperatura, mon.gpsval, mon.lat lat_mon, mon.dlat, mon.long long_mon, mon.dlong, mon.velocidad, mon.rumbo, mon.dispositivo_id disp_check, '+
                              'iala.cod, '+
                              'adsc.descripcion uni_ads_desc, '+
                              'acceso.descripcion acceso_desc, '+
                              'color.descripcion color_bombillo, '+
                              'modelo.caracteristicas, '+
                              'marca.descripcion marca_bombillo, '+
                              'evento.descripcion evento_alerta, '+
                              'inc.alerta_id, '+
                              'alert.descripcion descripcion_alerta '+
                       'FROM dispositivos d '+
                                  'LEFT JOIN monitoreo_actual mon ON mon.dispositivo_id = d.id '+
                                  'LEFT JOIN m_cod_iala iala ON iala.id = d.cod_iala_id '+
                                  'LEFT JOIN m_unidad_adscripcion adsc ON adsc.id = d.unidad_adscripcion_id '+
                                  'LEFT JOIN m_sistema_acceso acceso ON acceso.id = d.sistema_acceso_id '+
                                  'LEFT JOIN m_color_bombillo color ON color.id = d.color_bombillo_id '+
                                  'LEFT JOIN m_modelo_bombillo modelo ON modelo.id = d.modelo_bombillo_id '+
                                  'LEFT JOIN m_marca_bombillo marca ON marca.id = modelo.marca_bombillo_id '+
                                  'LEFT JOIN m_tipo_evento evento ON evento.id = mon.tipo_evento_id '+
                                  'LEFT JOIN (SELECT dispositivo_id, MIN(alerta_id) AS alerta_id, fecha_incidente, fecha_correccion '+
                                             'FROM incidencia '+
                                             'WHERE fecha_correccion IS NULL '+
                                             'GROUP BY dispositivo_id) inc ON inc.dispositivo_id = d.id AND fecha_incidente = mon.fecha '+
                                  'LEFT JOIN m_alerta alert ON alert.id = inc.alerta_id'
相关问题