簡體   English   中英

使用LEFT JOIN(SELECT)ORDER和LIMIT的MySQL查詢

[英]MySQL Query with LEFT JOIN (SELECT) ORDER and LIMIT

今天,我需要這個非常長的選擇查詢的幫助。

事情是我需要從1個表“ dispositivos”中獲取所有記錄,然后從LEFT JOIN“ monitoreo”中獲取其他一些表,而該查詢最重要的部分是加入表“ incidencia”。

一個“ dispositivo”可以有多個“ incidencia”,從所有“ incidencia”中,我需要一個列“ alerta_id”的值最低的應用程序,其中“ incidencia.fecha_incidente” =“ monitoreo.fecha”和“ incidencia.fecha_correccion” ”為NULL。

現在,由於我只需要“ incidencia”中的一條記錄,因此我使用LIMIT。

但是我一直在控制台上打印結果,當我在“ incidencia”的選擇查詢中使用limit時,來自它的5列為null,如果我不這樣做,那么實際上它為我帶來了整個數據,但是當然,它會針對找到的每個“偶然事件”重復“ 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

解決此問題的一種方法是使用內聯視圖,該視圖從要返回的“ incidencia”中返回行的唯一標識符,然后將其與inidencia表結合以獲取行。

例如

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

添加您選擇的min(alerta_id)並在末尾按alerta_id分組

您是否嘗試過將第二個LEFT JOIN更改為JOIN ?。聽起來好像您不希望與本節不匹配的行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM