更新时间间隔中第一次出现的值

时间:2018-02-23 20:02:44

标签: mysql

如果有另一列具有特定值,我正尝试按月间隔设置用户名列中第一次出现任何值的另一列的值。

create table table1
(
    username varchar(30) not null,
    `date` date not null,
    eventid int not null,
    firstFlag int null
);

insert table1 (username,`date`, eventid) values 
('john','2015-01-01', 1)
, ('kim','2015-01-01', 1)
, ('john','2015-01-01', 1)
, ('john','2015-01-01', 1)
, ('john','2015-03-01', 2)
, ('john','2015-03-01', 1)
, ('kim','2015-01-01', 1)
, ('kim','2015-02-01', 1);

这应该导致:

| username |       date | eventid | firstFlag |
|----------|------------|---------|-----------|
|     john | 2015-01-01 |       1 |         1 |
|      kim | 2015-01-01 |       1 |         1 |
|     john | 2015-01-01 |       1 |    (null) |
|     john | 2015-01-01 |       1 |    (null) |
|     john | 2015-03-01 |       2 |         1 |
|     john | 2015-03-01 |       1 |    (null) |
|      kim | 2015-01-01 |       1 |    (null) |
|      kim | 2015-02-01 |       1 |         1 |

我尝试将联接用作described here,但它会更新所有行:

update table1 t1
inner join 
(   select username,min(`date`) as minForGroup
    from table1
    group by username,`date`
) inr
on inr.username=t1.username and inr.minForGroup=t1.`date`
set firstFlag=1;

1 个答案:

答案 0 :(得分:0)

作为a1ex07 points out,每行需要另外一个唯一约束来更新我需要的行:

update table1 t1
inner join 
(   select id, username,min(`date`) as minForGroup
    from table1
    where eventid = 1
    group by username,month(`date`)
) inr
on inr.id=t1.id and inr.username=t1.username and inr.minForGroup=t1.`date`
set firstFlag=1;

添加Id列,并在约束连接上使用它。

要仅允许那些满足另一列上特定条件的那些,您需要子查询中的where子句,否则它将尝试匹配不同的行,因为子查询将返回具有eventid = 2的行,而更新查询将仅返回那些with eventid = 1。

要使用年度间隔而不是每月,请将group by语句更改为使用年份。