【问题标题】:Limit the results returned by MySQL join to 1将 MySQL join 返回的结果限制为 1
【发布时间】:2021-06-24 20:47:25
【问题描述】:

我正在对两个表进行 JOIN,右侧有多个 ON 子句的结果:e.ID = ti.event_id。如何将连接返回的结果限制为 1?有点像LIMIT 1

events_detailtbl:

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

events_start_endtbl:

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

当前查询:

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

实际结果:

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

首选结果:

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

【问题讨论】:

    标签: mysql sql join limit greatest-n-per-group


    【解决方案1】:

    使用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;
    

    【讨论】:

    • 你能解释一下这是做什么的吗?我对 SQL 不是很熟悉
    • 除了我遇到问题的连接之外,我还有其他几个连接要做 - 您的答案看起来像是将原始查询包装在另一个查询中,这使得应用变得困难
    【解决方案2】:

    我最终通过使用子查询解决了这个问题:

    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'
    

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 2012-08-06
      • 2015-01-19
      • 1970-01-01
      • 2014-05-12
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多