如何使用"大于"和"分组"创建联接?

get*_*ere 5 mysql join group-by

我有一个包含一系列名称,事件和日期的表格.我创建了一个evt5_date与特定事件(evt5)相关的新字段' ' .

每个名称可以有多个事件,每个事件的时间记录在evt_date字段中.两个事件evt1,并evt2涉及到evt5.

我想将第一次出现的日期插入evt5到所有行evt1evt2前面的行中evt5.如果没有evt5evt1evt2再保留该字段为空.

所有这些都必须为每个人完成name.有几千个不同的名字.我只在下面的数据中显示2

当前表数据 - evt5_date中没有值

name      evt_date       event    evt5_date
name-1    2010-06-30     evt1     
name-1    2009-10-30     evt5
name-1    2009-09-30     evt2      
name-1    2009-06-30     evt5          
name-1    2009-03-30     evt5     
name-1    2009-02-28     evt2     
name-1    2009-01-30     evt1     
name-2    2005-05-30     evt2
name-2    2005-03-30     evt5
name-2    2005-01-30     evt1     
Run Code Online (Sandbox Code Playgroud)

我希望它看起来如何 - evt5_date字段中的值

name      evt_date       event    evt5_date
name-1    2010-06-30     evt1     
name-1    2009-10-30     evt5
name-1    2009-09-30     evt2     2009-10-30 
name-1    2009-06-30     evt5          
name-1    2009-03-30     evt5     
name-1    2009-02-28     evt2     2009-03-30
name-1    2009-01-30     evt1     2009-03-30
name-2    2005-05-30     evt2
name-2    2005-03-30     evt5
name-2    2005-01-30     evt1     2005-03-31
Run Code Online (Sandbox Code Playgroud)

我尝试使用下面的代码执行更新,但我不知道如何指定evt5的日期大于evt1和evt2的evt_date之间的链接,同时还通过evt5分组以获得与之相关的evt_date最近的evt5.

我还需要按名称分组,因为事件特定于每个名称.

update mytable as t1
set t1.evt5_date = (select min(t2.evt_date) from mytable as t2
                    where t2.event = 'evt5' AND
                           t2.evt_date > t1.evt_date
                    group by name)
where
  t1.event in ('evt1', 'evt2')
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激.谢谢

更新最终解决方案 - @biziclop提供的一些小修改,以保持完整性name

UPDATE mytable AS t1
INNER JOIN
    (
      SELECT
             a.name, a.evt_date,
        MIN( b.evt_date ) AS nearest_date
      FROM       mytable AS a
      INNER JOIN mytable AS b ON b.event = 'evt5'
                            AND b.evt_date > a.evt_date
                            AND a.name = b.name       -- needed this additional condition
      GROUP BY a.name, a.evt_date                     -- added 'a.name' to 'group by' 
    ) AS nearest_dates 
       ON nearest_dates.evt_date = t1.evt_date AND
         nearest_dates.name = t1.name                 -- added this additional condition
SET t1.evt5_date = nearest_dates.nearest_date
WHERE t1.event IN ('evt1', 'evt2');
Run Code Online (Sandbox Code Playgroud)

biz*_*lop 5

我修正了您的更新声明,我认为它现在可以正常工作。我省略了该GROUP BY name部分,因为它在您的版本中没有意义。

UPDATE mytable AS t1
INNER JOIN
    (
      SELECT
        a.evt_date,
        MIN( b.evt_date ) AS nearest_date
      FROM       mytable AS a
      INNER JOIN mytable AS b ON b.event = 'evt5'
                            AND b.evt_date > a.evt_date
      GROUP BY a.evt_date
    ) AS nearest_dates ON nearest_dates.evt_date = t1.evt_date
SET t1.evt5_date = nearest_dates.nearest_date
WHERE t1.event IN ('evt1', 'evt2');
Run Code Online (Sandbox Code Playgroud)

首先进行一些验证:http : //sqlfiddle.com/#!2/309ac/6

最终UPDATE查询:http : //sqlfiddle.com/#!2/80c3c/1