php - SET a1 WHERE a AND b1 WHERE b AND c1 WHERE c, 等等

标签 php mysql arrays loops

我有一个包含图像数据的 MySQL 表。我的后端应用程序使用实时排序模块(拖放图像)。

我想要的是在 单个查询 中更新所有排序的图像 after 排序过程完成,而不是每次将图像放到新位置时更新单个查询(我需要在排序时禁用所有连接)。

至于现在,我是使用 foreach 循环完成的。比较两个数组 - 一个保存文件的原始顺序,第二个保存新顺序。排序完成后,它只更新顺序不同的图像。但是我不确定循环是否是触发多查询的好地方(有很多图像这可能会使应用程序严重重载)

public function setSortFilesinSql($new_sort_arr)
{
    $sql = new sql();
    $sql->sqlConnect();
    foreach ($new_sort_arr as $key=>$value){
        if($this->_original_sort[$key] != $value){
            $sql->query("UPDATE images SET sort='".$key."' WHERE name='".$value."' AND full_path='".$this->path."'");
        }
    }
    $this->_original_sort = $new_sort_arr;
    $sql->disconnect();
}

有没有办法“简化/加速”整个过程,或者将其设置为单个查询?


编辑

我检查过这样的 CASE 子句:

public function setSortFilesinSql($new_sort_arr)
{
    $sql = new sql();
    $sql->sqlConnect();
    $sort_query = "UPDATE images SET sort = CASE CONCAT(full_path, '/', name)";
    foreach ($new_sort_arr as $key=>$value){
        if($this->_original_sort[$key] != $value){
            $sort_query .= "WHEN '".$this->path."/".$value."' THEN '".$key."' ";
        }
    }

    $sort_query .= "ELSE sort END CASE";
    $sql->query($sort_query);
    $this->_original_sort = $new_sort_arr;
    $sql->disconnect();

}

上面的查询给我以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE'

最佳答案

我只写 SQL 部分,您可以从 PHP 构建它:

UPDATE images
SET sort = CASE name
    WHEN 'x' THEN 1
    WHEN 'y' THEN 2
    ...
    ELSE sort
    END
WHERE full_path='...';

此外,您可以使用 AND name in ('x', 'y') 过滤 WHERE 子句中的行。在这种情况下,您可以将 ELSE 部分保存在 CASE 中。

如果您想使用多个列来标识您的行,请使用:

UPDATE images
SET sort = CASE CONCAT(full_path, '/', name)
    WHEN 'path/x' THEN 1
    WHEN 'path/y' THEN 2
    ...
    ELSE sort
    END

关于php - SET a1 WHERE a AND b1 WHERE b AND c1 WHERE c, 等等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17683433/

相关文章:

mysql - 更新前更新同一个表中的不同行

javascript - 为什么内容只有在 onChange 之后才呈现?

php - 检查当前日期是否在两个日期之间+ mysql select查询

mysql - 随着表在 mysql 中的增长,插入速度变慢

shell - MYSQL 在一个事务中重放转储文件全部或全部

javascript - 创建数组的 JavaScript 搜索

c - 尝试对 c 中的结构数组使用 realloc 导致无效指针

Laravel 5 中的 PHPWord

PHP正则表达式括号内引号外

php - php restore_error_handler无法正常工作