如何基于特定日期更新所有行,并通过单个mysql查询按两个字段分组

时间:2017-04-26 18:14:32

标签: mysql

我有以下mysql表:

===================================
id | uid | vid |    date    | num |
===================================
 1 |  1  |  1  | 2017-01-01 |     |
 2 |  1  |  1  | 2017-02-20 |     |
 3 |  2  |  1  | 2017-02-25 |     |
 4 |  1  |  2  | 2017-03-05 |     |
 5 |  1  |  1  | 2017-04-01 |     |
===================================

我必须更新num列,如果日期是同一个uid&的最早日期。 vid,那么num列将是1,否则它将是2.因此,在更新数据库/表之后,表将是:

===================================
id | uid | vid |    date    | num |
===================================
 1 |  1  |  1  | 2017-01-01 |  1  |
 2 |  1  |  1  | 2017-02-20 |  2  |
 3 |  2  |  1  | 2017-02-25 |  1  |
 4 |  1  |  2  | 2017-03-05 |  1  |
 5 |  1  |  1  | 2017-04-01 |  2  |
===================================

2017-01-01是id#1中最早的日期,id#2& id#5 [uid=1 & vid=1],因此id=1的num为1,而id#2& id#5,num值为2.

但是,虽然uid=1适用于ID#4,但vid=2适用于此情况。因此,num=1 2017-03-05是最早且唯一一个id = 4 uid&视频组合。以同样的方式,对于id#3,num为1作为uid& vid是不同的。

如何创建单个mysql查询,以便根据uid,vid和amp;来自动更新num列。日期?

1 个答案:

答案 0 :(得分:0)

update your_table t
left join (
    select 
        uid, vid, min(id) as id
    from your_table t 
    join (
        select uid, vid, min(date) as date
        from your_table
        group by uid, vid
    ) t2 using (uid, vid, date)
    group by uid, vid
) t2 on t.uid = t2.uid
    and t.vid = t2.vid
    and t.id = t2.id
set num = case when t2.id is null then 2 else 1 end;