我需要做类似的事情:
SELECT id FROM table WHERE option='1' ORDER BY time LIMIT 1
然后使用$ id
中的idUPDATE table SET used='1' WHERE id='$id'
问题是,这样另一个用户可以同时更新同一条记录。 有没有办法在一次操作中做到这一点?
由于
答案 0 :(得分:3)
UPDATE table SET used='1'
WHERE id=
(SELECT id FROM
(SELECT id FROM table
WHERE option='1'
ORDER BY time
LIMIT 1) AS tmptable
)
答案 1 :(得分:2)
如果您有不同用户对同一行的并发访问权限,则需要使用三步查询。
在步骤#1和#2之间,多个用户可以尝试获取对该行的编辑访问权限,但最终只有一个成功。失败者将无法进入第3步。
PS :这可能对您的需求有些过分,但这是确保多个用户同时处理任务(行)的最佳方式。
PPS :或者只是将查询合并为一个查询,另一个答案指出。但是,如果您的更新需要完成一些工作,最好先决定谁将在更新值之前完成工作。
答案 2 :(得分:-1)
您可以使用:http://php.net/manual/en/mysqli.insert-id.php
mysql_insert_id
查找更新或设置的最后一个ID并将其存储。然后我们检查以确保最后一个id不存在。
所以...
//last id being the id of the last query set or updated
$last_id = $mysql->insert_id;
if($last_id != $id) {
//execute code
{
else {
echo "last id already in database!";
}
如果我误解了这个问题,你仍然应该能够看到如何使用最后一个id来做你想做的事。
这是一个使用它的例子。首先,我们使用创建ID的表单数据更新表。然后我们将输入复选框数组添加到最后更新的ID。
//define input variables
$lesson_id = $_POST['lesson_id'];
$user_id = $_POST['user_id'];
$instructor_id = $_POST['instructor_id'];
$lesson_comments = $_POST['lesson_comments'];
$lesson_date = date("Y-m-d");
$video_ids = isset($_POST['checkbox']) ? $_POST['checkbox'] : array(); # this is called a ternary operator
//insert lesson information first
$query ="INSERT INTO swing_viewer_lessons (lesson_id, user_id, instructor_id, lesson_comments, lesson_date) VALUES (?, ?, ?, ?, ?)";
if ($stmt = $mysqli->prepare($query)) {
$stmt->bind_param("iiiss", $lesson_id, $user_id, $instructor_id, $lesson_comments, $lesson_date);
$stmt->execute();
//printf($stmt->error);
echo "successful";
//echo "$last_id";
}
//insert lesson information
if (is_array($video_ids) && count($video_ids) > 0)
{
foreach($video_ids as $list);
}
// Make it into a comma separated list
$rec_ids = implode(',', $video_ids);
//get last inserted id from above
$last_id= $mysqli->insert_id;
//finally query and update lesson information based on the last id added from above
$query ="UPDATE swing_viewer_lessons SET video_ids=? WHERE id=?";
if ($stmt = $mysqli->prepare($query)) {
$stmt->bind_param("si", $rec_ids, $last_id);
$stmt->execute();
}
希望这对你或其他任何人有所帮助,因为有一次我在这里拉头发。