MySQL更新修复两个行与一个查询


MySQL Update Fix Two rows with one query

这是代码给我的问题-我试图用一个插入更新多个记录。这些值被放在一个数组中,并使用foreach准备了mysqli更新。但这行不通。只是给出了一个mysql关于更新语法的错误。

 foreach($users as $user){
     if(empty($course))     continue;
     $query_string .= " SET group_id='$group_id' WHERE user_id='".$user."'; "; 
     } 
$query_string = substr($query_string,0,-1);
    $query = "UPDATE users" . $query_string;
    $result = mysqli_query($dbc, $query) or trigger_error("Query: $query");

给出的错误是:你有一个错误在你的SQL语法;查看与MySQL服务器版本对应的手册,以便在"SET group_id='10' WHERE user_id='5'"附近使用正确的语法。

假设您有多个用户,您的查询将看起来像

UPDATE users SET ... SET ... SET ... SET ...

是不正确的。不能以这种方式对多行执行更新。要么做多个查询,每个更新一个学生,要么你必须建立一个巨大的case/if块来在单个查询中做到这一点。

你最好做多个查询,因为你可能会花费更多的时间来构建整体查询,而不是运行单个更新。

WHERE…IN

UPDATE foo SET bar = 0 WHERE baz IN (1,2,3,4,5,6)

(假设您将它们都设置为相同的组ID,这在提供的上下文中并不清楚)

试试下面的代码:

<?php 
$queries = array();
foreach($users as $user){
    if(empty($course)) continue;
    $queries[] = "update users set group_id = '" . mysql_real_escape_string($group_id) . "' where user_id = '" . mysql_real_escape_string($user) . "'";
}
array_map('mysql_query', $queries);
?>

您的问题是您没有将不同的用户与;分开。由于要将所有用户更新为具有相同的组(我不确定情况是否如此,否则情况会变得复杂得多),您可以简单地使用OR扩展条件。您得到的查询将类似于以下内容:

UPDATE users SET group_id='42' WHERE user_id='1' OR user_id='2' OR user_id='3';

另一个解决方案是使用WHERE ... IN。下面是一个例子:

UPDATE users SET group_id='42' WHERE user_id IN (1, 2, 3);