我想使用一个查询来更新MySQL表中的多条记录。基本上,这是一个任务表,在不同的日期为不同的人分配任务。当这些作业被更改并通过在线表单提交时,会提交大量的帖子数据(几乎所有待完成的作业)。我已经编写了一个算法来对所有这些信息进行排序,并从中获得我想要的东西,但是我不得不编写查询来更新MySQL表:
// Find the modified records and save their information
$update = 0;
for ( $n = 0; $n < $total_records; $n++ )
{
if ( $_POST['update'.$n] == true )
{
$updates_arr[$update] = array( intval($_POST['user_id'.$n]), intval($_POST['task'.$n]), $_POST['date'.$n] );
$update++;
}
}
if ( $mysql_db = OpenDatabase() )
{
$query = "UPDATE tasks_tbl";
if ( $updates_arr[0] )
{
$query .= " SET task = ".$updates_arr[0][1]." WHERE user_id = ".$updates_arr[0][0]." AND date = ".$updates_arr[0][2];
}
for ( $n = 1; $n < $updates; $n++ )
{
$query .= ", SET task = ".$updates_arr[$n][1]." WHERE user_id = ".$updates_arr[$n][0]." AND date = ".$updates_arr[$n][2];
}
$result = mysql_query( $query, $mysql_db );
if ( $result )
{
$page .= "<p>Success!</p>\n\n";
}
else
{
$page .= "<p>Error: ".mysql_error()."</p>\n\n";
}
}这是生成的查询:
UPDATE tasks_tbl
SET task = 1
WHERE user_id = 16
AND date = 2010-05-05,
SET task = 1
WHERE user_id = 17
AND date = 2222-02-22如有任何建议,我们将不胜感激。谢谢。
发布于 2009-12-15 03:25:17
谢谢大家的建议。我最终使用了多个查询,因为它显然不会像我希望的那样简单。
foreach ( $updates_arr as $record => $data ):
$query = "UPDATE tasks_tbl";
$query .= " SET task = ".$data[1];
$query .= " WHERE task_id = ".$data[0];
$result = mysql_query( $query, $mysql_db );
if ( !$result )
{
break;
}
endforeach;发布于 2009-12-15 02:14:04
您可以生成如下查询:
UPDATE tasks_tbl SET task=1 WHERE
(user_id=16 AND date='2010-05-05') OR
(user_id=17 AND date='2010-02-22')有一些技巧可以避免使用(... and ...) or (... and ...)构造(连接字段和params:"concat(user_id, date) = '". $user_id. $date. "'",但它们的工作速度会稍慢一些。
PHP代码:
for ($i = 0; !empty($_POST['update'. $i]; $i++)
if (intval($_POST['task'.$i]) == 1)
$cond[] = '(user_id='. intval($_POST['user_id'. $i]).
' and date=\''. mysql_real_escape_string($_POST['date'.$i]). '\')';
$query = 'UPDATE tasks_tbl SET task=1 WHERE '. implode(' OR ', $cond). ')';编辑:我不太明白为什么你需要在一个查询中这么做。task可以有多少个值? 1、2、3或更多?有了3个值,您就可以使用嵌套的IF(...)函数:
UPDATE tasks_tbl SET task=if('. <imploded tasks with value 1>. ', 1, if('.
<tasks with value 2>. ', 2, if('. <tasks with 3>. ', 3,
task))) /* leave as is otherwise */或者,您可以在我给出的代码中添加一个简单的循环:
for ($j = 1; $j <= 3; $j++)
for ($i = 0; !empty($_POST['update'. $i]; $i++)
if (intval($_POST['task'.$i]) == 1)
$cond[] = '(user_id='. intval($_POST['user_id'. $i]).
' and date=\''. mysql_real_escape_string($_POST['date'.$i]). '\')';
mysql_query('UPDATE tasks_tbl SET task=1 WHERE '. implode(' OR ', $cond). ')');发布于 2009-12-15 03:18:56
我不同意你这里的架构,但是下面的应该是可行的。使用风险自负:
UPDATE
Tasks_Table
SET
task =
CASE
WHEN user_id = 16 AND date = 2010-05-05 THEN 1
WHEN user_id = 17 AND date = 2222-02-22 THEN 1
...
END
WHERE
(user_id = 16 AND date = 2010-05-05) OR
(user_id = 17 AND date = 2222-02-22) OR
...在您的示例中,所有情况下都有task =1,但是可以使用case语句将它们更改为每个CASE所需的值。我会把构建字符串的工作留给你。
https://stackoverflow.com/questions/1902479
复制相似问题