Mysql 基于时间戳更新类行

Mysql 基于时间戳更新类行,mysql,Mysql,我有几行需要根据类似的时间戳和用户id进行更新。 所以我的数据看起来像这样 | INT(11) | TIMESTAMP | VARCHAR(50) | | user id | timestamp | like id | | 1 | 10/20/2014 10:30 | | | 1 | 10/20/2014 9:45 | | | 1 | 10/20/2014 22:30

我有几行需要根据类似的时间戳和用户id进行更新。
所以我的数据看起来像这样

| INT(11) | TIMESTAMP        | VARCHAR(50) |
| user id | timestamp        | like id     |  
| 1       | 10/20/2014 10:30 |             |
| 1       | 10/20/2014 9:45  |             |  
| 1       | 10/20/2014 22:30 |             |
| 2       | 10/20/2014 9:45  |             |  
| 3       | 10/20/2014 10:30 |             |
| 3       | 10/20/2014 9:45  |             |  
我希望它像这样更新,其中具有相同用户id和时间戳的行, 如果在一小时内(同一天)任何其他行中有另一个具有相同用户id的条目,则时间戳匹配

| user id | timestamp        | like id |  
| 1       | 10/20/2014 10:30 | ASDF-1  |
| 1       | 10/20/2014 9:45  | ASDF-1  |
| 1       | 10/20/2014 11:30 | ASDF-1  |
| 1       | 10/20/2014 21:45 | ADGG-2  |   
| 1       | 10/20/2014 22:30 | ADGG-2  |
| 2       | 10/20/2014 9:45  | GFDQ-3  |  
| 3       | 10/20/2014 10:30 | QWER-4  |
| 3       | 10/20/2014 9:45  | QWER-4  |  
这可以在MYSQL update语句中实现吗?我还没有想到一个办法


编辑:我还想为每个分组的like_id生成一个随机的50char字符串这里是一个SQL查询,它返回您想要的:

select t.userid, t.timestamp,
       (@rn := if(@u = userid and @ts <= timestamp + interval 1 hour,
                  if(@ts := timestamp, @rn, @rn),
                  if(@u := userid, if(@ts := timestamp, @rn + 1, @rn + 1), @rn + 1)
                 )
       ) as likeid
from table t cross join
     (select @rn := 0, @u := 0, @ts := 0) vars
order by userid, timestamp;

这是一个时间戳类型的列,还是VARCHAR?请不要说您没有使用MySQL指定的一个列来保存日期和时间值。我使用列类型进行了编辑。对不起,是的,我已经在为我的时间戳使用时间戳列类型。编辑,对不起,我添加了另一个要求。您认为可以修改为使用随机字符串而不是增量数字作为类似的\u ID吗?@DavePark。您应该将其作为另一个问题添加,而不是在回答此问题后修改此问题。但是,您可以使用带有参数的
rand()
来获得“随机”浮点,在这里您可以选择所需的任意位数。
update t join
       (select t.userid, t.timestamp,
               (@rn := if(@u = userid and @ts <= timestamp + interval 1 hour,
                          if(@ts := timestamp, @rn, @rn),
                          if(@u := userid, if(@ts := timestamp, @rn + 1, @rn + 1), @rn + 1)
                         )
               ) as likeid
        from table t cross join
             (select @rn := 0, @u := 0, @ts := 0) vars
        order by userid, timestamp
       ) tnew
       on t.userid = tnew.userid and t.timestamp = tnew.timestamp
    set t.likeid = tnew.likeid;