对于循环,递增并插入前一行中的值


For Loop that increments and inserts a value from the previous row

我试图将插入MySQL表的最后一个条目的值增加x%,然后将该值插入数据库并继续,直到循环结束,从基值100开始。

假设我从第一行的$base_value为100开始,我希望在迭代中将该值增加25%。所以,在第二行,我希望100增加25%。在第三行中,第二行的值增加了25%等,当达到100时循环停止。如何做到这一点?

$base_value = 100;
$increase_by; // x percent
for($i = 1; $i = 100; $i++)
{
    mysql_query("insert into table values(
       '',
       '$i',
       ''
    )");
}

类似的东西?:

$base_value = 100;
$increase_by; // x percent
for($i = 1; $i <= 100; $i++)
{
    mysqli_query("insert into table values(
       '$base_value',
       '$i',
       ''
    )");
    $base_value = $base_value + ($base_value * $increase_by);
}

需要注意的几点:

  • 我已经用mysqli_query替换了mysql_query,我建议你也这样做。PHP也提出了这一点
  • 我将您的for循环中的终止条件从$i = 100更改为$i <= 100。如果前者真的有效,我不确定会是什么行为。这是在条件中设置$i,这首先是永远不想做的事情。但这也意味着它要么永远不会运行,要么无限期运行,这取决于它如何将赋值语句解释为布尔值。这两种选择都不可取
  • 这个数学假设$increase_by是正确的小数位数。如果你用实际值"25"来表示"25%"的概念,那么你必须调整数学来解释这种差异
  • SQL查询本身在其他方面没有受到影响,因为我认为这是一个人为的例子。但是,为了防止值得指出的是,您有第三个不必要的值,并且您的表名为table,这可能是个坏主意:)

为了好玩,假设第一行的值为零,另一种选择是以uid为主键的SQL查询。

$base_value = 100;
$factor = 1.25; // Take previous value and times it by 125%
// ...
mysqli_query(
"INSERT INTO table (my_value)
SELECT (my_value * $factor) AS my_value FROM table ORDER BY uid DESC LIMIT 1"
);
$base_value *= $factor;
// ...

然而,如果你有并发操作,并且在没有测试的情况下,我的蜘蛛侠感觉说,如果表是空的,那么在第一次迭代时就会遇到障碍。不管怎样,欢迎发表评论。显然,@David的解决方案更合理:)