mysql - 如何使用 'greater than' 和 'group by' 创建连接?

标签 mysql join group-by

我有一个包含一系列姓名、事件和日期的表格。我创建了一个与特定事件 (evt5) 相关的新字段“evt5_date”。

每个名称可以有多个事件,每个事件的时间记录在 evt_date 字段中。 两个事件 evt1evt2evt5 相关。

我想将 evt5 第一次出现的日期插入 evt5< 之前的所有 evt1evt2 行中。如果在 evt1evt2 之后没有 evt5,则该字段留空。

所有这些都必须为每个 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     

我希望它看起来如何 - 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

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

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

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

如有任何建议,我们将不胜感激。谢谢

更新最终解决方案 - 对@biziclop 提供的答案进行一些小改动以保持名称

的完整性
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');

最佳答案

我修复了你的更新语句,我认为它现在可以工作了。我省略了 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');

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

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

关于mysql - 如何使用 'greater than' 和 'group by' 创建连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11084256/

相关文章:

mysql - 从连接表中选择与所有选定行匹配的行

mysql - 一旦 HAVING 条件必须为真,MySQL 是否足够聪明以停止考虑行?

sql - 修改 Group By 以获得正确的结果

MySQL 选择下一个较低的数字,但最多 10%

mysql - 如何使用 sails.js 模型文件中的大小定义 "TINYINT"数据类型

PHP:标记系统 JOIN 语句

mysql - 在 mySQL 中使用 MAX() 函数时获取正确的详细信息

php - MySQL : using datetime or timestamp for logged in history

join - Doctrine join 绕过延迟加载

mysql - 如何将 3 种不同类型的 SQL 查询合并为 1 种