使用 where 语句批量更新 mysql

Bulk update mysql with where statement

如何批量更新mysql数据? 如何定义这样的东西:

UPDATE `table` 
WHERE `column1` = somevalues
SET  `column2` = othervalues

一些值如:

VALUES
    ('160009'),
    ('160010'),
    ('160011');

和其他值:

VALUES
    ('val1'),
    ('val2'),
    ('val3');

也许 mysql 不可能? php 脚本 ?

如果你有数组格式的数据,那么试试这个

您的查询类似于 "UPDATE table WHERE column1 = ? SET column2 = ?"

然后像下面这样设置

foreach($data as $key => $value) {
    $query->bind_param('ss', $key, $value);
    $query->execute();
}

希望它能奏效。

引用自this

针对您的情况,最简单的解决方案是使用 ON DUPLICATE KEY UPDATE 构造。它工作得非常快,而且工作起来很简单。

INSERT into `table` (id, fruit)
    VALUES (1, 'apple'), (2, 'orange'), (3, 'peach')
    ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);

或使用CASE构造

UPDATE table
SET column2 = (CASE column1 WHEN 1 THEN 'val1'
                 WHEN 2 THEN 'val2'
                 WHEN 3 THEN 'val3'
         END)
WHERE column1 IN(1, 2 ,3);

如果您拥有的 "bulk" 数据是动态的并且来自 PHP(毕竟您确实标记了它),那么查询将如下所示:

INSERT INTO `foo` (id, bar)
VALUES 
    (1, 'pineapple'),
    (2, 'asian pear'),
    (5, 'peach')
ON DUPLICATE KEY UPDATE bar = VALUES(bar);

和 PHP 从现有数组生成它(假设数组的格式如下:

$array = (
    somevalues_key => othervalues_value
);

) 看起来像这样(绝不是最好的(例如,不解决转义或清理值),只是一个简单的例子):

$pairs = array();
foreach ($array as $key => $value) {
    $pairs[] = "($key, '$value')";
}

$query = "INSERT INTO `foo` (id, bar) VALUES " . implode(', ', $pairs) . " ON DUPLICATE KEY UPDATE bar = VALUES(bar)";

如果您使用拖放 tableView 或 collectionView 对应用中的数据进行排序,例如允许用户通过拖放功能排列他们的照片,请在用户编辑后将逗号分隔的有序 ID 列表发送到后端完成。

在你的后端,将 ids 分解成一个数组,比如

$new_ranks = array();
$supplied_orders = explode(",", $_POST["supplied_new_order"]); //52,11,6,54,2 etc
$start_order = 99999;
foreach ($supplied_orders as $supplied_row_id) {
    //your all validations... make sure supplied_row_id belongs to that user or not etc..

    $new_ranks[intval($supplied_row_id)] = $start_order--;
}

现在,您可以更新所有新排名,例如@Farside 推荐 2。

if (count($new_ranks) > 0) {
    $case_sqls = array(); 
    foreach ($new_ranks as $id => $rank) {
        $case_sqls[] = "WHEN ".intval($id)." THEN ".intval($rank)."";
    } 
    $case_sql = implode(" ", $case_sqls);

    $this->db->query("
        UPDATE 
            service_user_medias
        SET 
            rank = (CASE id ".$case_sql." END)
        WHERE 
            id IN(".implode(",", array_keys($new_ranks)).");
    ");
}