0

我需要做这样的事情:

SELECT id FROM table WHERE option='1' ORDER BY time LIMIT 1

然后使用 $id 中的 id

UPDATE table SET used='1' WHERE id='$id'

问题是这样另一个用户可以同时更新相同的记录。有没有办法在一次操作中做到这一点?

谢谢

4

3 回答 3

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
    )
于 2013-08-25T20:39:05.627 回答
2

如果不同用户同时访问同一行,则需要使用三步查询。

  1. 第一个查询必须为某个用户保留该行使用专用字段)。
  2. 第二个查询必须检查行保留是否针对该特定用户
  3. 第三个查询更新该行,因为该用户保留了它,因此知道没有冲突。

在第 1 步和第 2 步之间,多个用户可以尝试获取对该行的编辑权限,但最终只有一个用户成功。那些失败的将不会到达第 3 步。

PS这对于您的需求可能有点过分,但它是确保多个用户同时处理任务(行)的最佳方式。

PPS或者只是将查询组合成一个,因为另一个答案指出。但是,如果您的更新需要完成一些工作,最好在更新值之前预先决定由谁来完成工作。

于 2013-08-25T20:47:11.420 回答
-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();
}

希望这可以帮助您或其他任何人,因为有一次我正在为此拉头发。

于 2013-08-25T20:43:48.843 回答