2014-10-20 125 views
0

我有几行想要根据时间戳和用户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和时间戳,行 其中timestamp,如果有一个小时内另一个项目(匹配同一天)在具有相同用户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更新语句中?我还没有想到办法。

编辑:我想也生成每个分组的like_ids

+1

那是一个TIMESTAMP类型的列或VARCHAR? – 2014-10-20 20:42:29

+0

请不要说你没有使用指定的MySQL列**中的一个来保存日期和时间值**。 – 2014-10-20 20:44:02

+0

我用列类型编辑过。对不起,是的,我已经在使用TIMESTAMP列类型作为我的时间戳了。 – 2014-10-20 20:46:33

回答

1

下面是一个SQL查询的随机50char字符串,返回你想要什么:

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; 

所有怪异的语法与嵌套0​​s是将变量的赋值放入单个语句中。

然后,您可以用这个更新:

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; 
+0

编辑,对不起,我添加了另一个要求,你认为你可以修改使用随机字符串,而不是增量数字为like_ids? – 2014-10-20 20:50:45

+0

@DavePark。 。 。您应该将其添加为另一个问题,而不是在回答问题后修改此问题。但是,您可以使用带有参数的rand()来获得一个“随机”浮点数,您可以在其中选取任意数量的数字。 – 2014-10-20 21:35:59