我想从MySQL表中检索许多行,并记住以后要检索的行。 (我将它们发送到API,并且需要跟踪它们是否被接受)。
我要实现的方法是使用UPDATE
查询,以便为100条左右的记录创建一个batch_id
。我还想退回batch_id
。
这是到目前为止我想出的(完整的PHP函数):
function get_batch() {
global $DB;
$q = $DB->prepare("UPDATE my_table
SET batch_id = LAST_INSERT_ID(MIN(id))
WHERE batch_id = ''
LIMIT 100");
$q->execute();
return $DB->lastInsertId();
}
这是对组函数的无效使用(可能是因为我不能在更新单个行的同时在所有行上使用MIN)。
我可以使用子查询来找到最低的ID,但是我想知道是否有更好的方法?
我还不确定在这种情况下我对LAST_INSERT_ID
的使用是否正确(将其设置为稍后检索)?
答案 0 :(得分:0)
您可以执行两个查询,一个查询获取要更新的行,另一个查询更新它们。
SELECT * FROM my_table WHERE batch_id='' ORDER BY id ASC LIMIT 100
然后,您可以执行类似for循环的操作,在该操作中,您可以使用...分别进行操作。
UPDATE my_table SET batch_id='value' WHERE id = $i
或者,如果行的id将成块且没有间隙,则可以执行以下操作...
UPDATE my_table SET batch_id='value' WHERE id >= $min_value_id AND id <= $max_value_id
请参见this question。
答案 1 :(得分:0)
最后,我能提出的最佳解决方案是:
function get_batch() {
global $DB;
$q = $DB->prepare("UPDATE my_table
SET batch_id = (
SELECT batch_id FROM (
SELECT LAST_INSERT_ID(MIN(id)) AS batch_id
FROM my_table WHERE (batch_id = 0)
) b
)
WHERE batch_id = 0 ORDER BY id LIMIT 100");
$q->execute();
return $DB->lastInsertId();
}
请注意,子查询在(b)中需要另一个子查询,这与让MySQL将子查询结果复制到单独的表空间(related question)有关。