使用time()数学更新多个列

时间:2014-08-25 11:26:28

标签: php mysql

我有一个名为vips的表格,其中包含列:

  

用户,timePayed,timeEnds,months

用户,timePayed和几个月正在按我想要的值(意味着他们正在工作)。现在他们拥有的是用户名:用户名

  

timePayed:time()(付款的时间戳)

     

月:1-7(选择买家)

现在我每次加载页面时都尝试放置一个函数来“刷新”'timeEnds'列。所以我的功能里面有这个:

 $timeNow = time();
 $query = DB::query("SELECT * FROM vips WHERE timeEnd='new';");
 $row = mysql_fetch_assoc($query);

 $months = $row['months'];
 $timePayed = $row['timePayed'];
 $payEnds = strtotime('+'.$months.' months +1', ($timePayed - $timeNow));

现在我想以某种方式添加:

 DB::query("UPDATE vips SET timeEnd='$payEnds' WHERE timeEnd='$payEnds';");

对于每列更新列 - > payEnds = months * timesPayed但我不能。列看起来像这样:

 user  timePayed   TimeEnds     months
 78 1408958750  new          2
 79 1408958752  new          6
 73 1408958904  new          8

应该看起来像:

 user  timePayed   TimeEnds     months
 78 1408958750  5350978      2
 79 1408958752  5350978      6
 73 1408958904  5350978      8

示例:5350978 =将成为这个(我想即使这是错误的:

 DB::query("UPDATE vips SET timeEnd='$payEnds' WHERE timeEnd='$payEnds';");

1 个答案:

答案 0 :(得分:1)

这种方法需要多次查询才能正常运行。

幸运的是MySQL是为此而制作的,所以只需运行此查询:

UPDATE vips 
SET timeEnds = UNIX_TIMESTAMP( (DATE_ADD( FROM_UNIXTIME(timePayed), INTERVAL months MONTH ) )) - UNIX_TIMESTAMP(NOW()) 

这意味着:

FROM_UNIXTIME(timePayed) 
    -> convert from unix time to MySQL date
DATE_ADD( FROM_UNIXTIME(timePayed), INTERVAL months MONTH )  
    -> find out the expiry date
UNIX_TIMESTAMP(...)
    -> we convert the whole expiry date back to integer, for easier math
UNIX_TIMESTAMP(NOW())
    -> we see how much time is left between now and the expiry date

缺点:

  • NOW()不是复制友好的
  • 不可扩展,在每个请求的1000000条记录上运行此操作将会很糟糕
  • 如果您决定使用视图和表而不是仅使用此表,则
  • 可能是重构问题

如果这是一件小事,你可以这样做,但如果你想做一件更大的事情,你应该只在需要时计算timeEnds