sql: limita los resultados devueltos por MySQL join a 1

CorePress2024-01-25  254

Estoy haciendo un JOIN en dos tablas y el lado derecho tiene múltiples resultados para la cláusula ON: e.ID = ti.event_id. ¿Cómo limito los resultados devueltos por la unión a 1? Algo así como LÍMITE 1

eventos_detalle tbl:

ID | event_code
---------------
1  | 123-abc
2  | 234-bcd
3  | 345-cde

events_start_end tbl:

id | event_id | start_time | end_time


------------------------------------

- 1 | 1 | 12:00 | 17:00 2 | 1 | 13:00 | 15:00 3 | 2 | 12:00 | 15:00 4 | 3 | 07:00 | 10:00 5 | 3 | 08:00 | 11:00

Consulta actual:

SELECT e.ID, e.event_code, ti.start_time, ti.end_time 
FROM events_detail AS e 
LEFT JOIN events_start_end AS ti 
  ON e.ID = ti.event_id 
WHERE e.event_status = 'A';

Resultados reales:

ID | event_code | start_time | end_time


------------------------------------

--- 1 | 123-abc | 12:00 | 17:00 1 | 123-abc | 13:00 | 15:00 2 | 234-bcd | 12:00 | 15:00 3 | 345-cde | 07:00 | 10:00 3 | 345-cde | 08:00 | 11:00

Resultados preferidos:

ID | event_code | start_time | end_time


------------------------------------

--- 1 | 123-abc | 12:00 | 17:00 2 | 234-bcd | 12:00 | 15:00 3 | 345-cde | 07:00 | 10:00


------------------------------------

Usa ROW_NUMBER():

SELECT e.*
FROM (SELECT e.ID, e.event_code, ti.start_time, ti.end_time,
             ROW_NUMBER() OVER (PARTITION BY e.event_code ORDER BY t1.start_time) as seqnum 
      FROM events_detail e LEFT JOIN
           events_start_end ti 
           ON e.ID = ti.event_id 
      WHERE e.event_status = 'A'
     ) e
WHERE seqnum = 1;

2

¿Puedes explicar qué está haciendo esto? No estoy muy familiarizado con SQL

- gratis

28/03/2021 a las 16:54

Tengo que hacer varias otras uniones además de la que tengo problemas. Parece que su respuesta incluye la consulta original en otra consulta, lo que dificulta su aplicación

- gratis

28/03/2021 a las 17:02

------------------------------

Terminé resolviendo esto usando una subconsulta:

SELECT `e`.`ID`, 
       `e`.`event_code`, 
       `ti`.`start_time`, 
       `ti`.`end_time` 
FROM `events_detail` AS `e` 
LEFT JOIN `events_start_end` AS `ti` 
    ON `ti`.`id` = (
        SELECT `id` 
        FROM `events_start_end` 
        WHERE `events_start_end`.`event_id` = `e`.`ID` 
        LIMIT 1
    ) 
WHERE `e`.`event_status` = 'A'

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare