有没有一种方法可以更新行以添加批次ID并返回该ID?

时间:2018-07-13 10:41:38

标签: php mysql pdo

我想从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的使用是否正确(将其设置为稍后检索)?

2 个答案:

答案 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)有关。