首页 > 解决方案 > 更新 Select 查询循环所基于的字段

问题描述

这是我的 mysql 查询的一个粗略示例(注意:这是在通过所有用户的另一个循环中):

$query = db.query('SELECT * FROM table WHERE userid = $uid AND reminded = 0');

while ($row = $query->fetch()) {
  // send personalized reminder email to the user
  db.query('UPDATE table SET reminded = 1 WHERE userid = $uid');
}

对于该用户的所有实例,该字段reminded都设置为 1。

我的问题是:查询/while (fetch) 是否已经根据原始条款 ( reminded = 0) 加载到内存中,或者剩余的 while 循环是否会根据这些更新 ( reminded = 1) 运行?

假设用户有 50 行,其中reminded0 为 0,并且查询选择了这些:即使在循环期间它们都被更改为 1,它们是否仍然存在于 while 循环的其余部分中,值为 0?

标签: phpmysqlpdo

解决方案


假设您拥有的代码和 SQL 只是一个示例(因为您应该直接更新而无需 php 循环)。

对行的提取table是在 DB 上逐行执行的。

因此,如果在 while 循环中更新了这些行中的一个或多个,在下一次迭代中,您将检索和更新(再次)先前更新的行。

ORDER BY我认为“仅”在更新作为索引一部分的字段或在 SQL 中用于检索数据的字段(例如,在 中使用的字段等)时,您必须小心。


推荐阅读