首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用单个MySQL查询更新表中的多条记录?

问如何使用单个MySQL查询更新表中的多条记录?
EN

Stack Overflow用户
提问于 2009-12-15 02:04:50
回答 6查看 1.3K关注 0票数 0

我想使用一个查询来更新MySQL表中的多条记录。基本上,这是一个任务表,在不同的日期为不同的人分配任务。当这些作业被更改并通过在线表单提交时,会提交大量的帖子数据(几乎所有待完成的作业)。我已经编写了一个算法来对所有这些信息进行排序,并从中获得我想要的东西,但是我不得不编写查询来更新MySQL表:

代码语言:javascript
复制
  // 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";
     }
  }

这是生成的查询:

代码语言:javascript
复制
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

如有任何建议,我们将不胜感激。谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-15 03:25:17

谢谢大家的建议。我最终使用了多个查询,因为它显然不会像我希望的那样简单。

代码语言:javascript
复制
    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;
票数 1
EN

Stack Overflow用户

发布于 2009-12-15 02:14:04

您可以生成如下查询:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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(...)函数:

代码语言:javascript
复制
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 */

或者,您可以在我给出的代码中添加一个简单的循环:

代码语言:javascript
复制
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). ')');
票数 5
EN

Stack Overflow用户

发布于 2009-12-15 03:18:56

我不同意你这里的架构,但是下面的应该是可行的。使用风险自负:

代码语言:javascript
复制
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所需的值。我会把构建字符串的工作留给你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1902479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档