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

标签 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”的选择查询中使用 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

最佳答案

解决此问题的一种方法是使用内联 View ,该 View 从您要返回的“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

关于带有 LEFT JOIN (SELECT) ORDER 和 LIMIT 的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126015/

相关文章:

mysql - 根据 SQL 中的组过滤掉重复项

mysql - PhpMy管理员密码

c# - 我如何从 c# 中的 mdr.Read() 命令中只读取一条记录

sql - 如何将一张 table 铺到另一张 table 上

java - JPA Criteria API - 如何添加 JOIN 子句(尽可能一般的句子)

mysql - 使用得到的结果集再次查询

PHP加载预先保存的表单

java - 从带有 'static' 变量的文本框中获取文本

mysql - 如何优化这个 MySQL 查询? (移动窗口)

Mysql连接查询;它是什么以及我如何实现它?