今天我需要帮助来处理这个非常长的select查询。
问题是我需要从一个表“dispositivos”中获取所有记录,然后左键连接“monitoreo”,其他一些表,这个查询最重要的部分是连接表“incidencia”。
一个“dispositivo”可以有许多“incidencia”,从所有的“incidencia”中,我需要一个“alerta_id”列具有最低值的列,“incidencia.fecha_incident”=“monitoro.fecha”和“incidencia.fecha_correction”为空。
现在,因为我只需要一张“突发事件”的记录,所以我使用了LIMIT。
然而,我一直在控制台上打印结果,当我在“incidencia”的select查询中使用limit时,它将来自它的5列设置为空,如果不使用,那么它实际上会为我带来整个数据,但它当然会为找到的每个“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
最佳答案
解决此问题的一种方法是使用一个内联视图,该视图从要返回的“incidencia”返回行的唯一标识符,然后将其连接到incidencia表以获取行。
例如
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