我有一个包含图像数据的MySQL表。我的后端应用程序正在使用实时排序模块(拖放图像)。
我希望在一个查询中更新排序过程完成后的所有排序图像,而不是每次将图像放到新位置时更新单个查询(排序时需要禁用任何连接)。
至于现在,我是用一个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();

}

上面的查询给出了以下错误:
您的SQL语法有错误;请查看对应于MySQL服务器版本的手册,以获得在“CASE”附近使用的正确语法

最佳答案

我只写了SQL部分,你可以用PHP来构建它:

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

此外,还可以使用WHERE筛选AND name in ('x', 'y')子句中的行。在这种情况下,您可以保存案例中的其他部分。
如果要使用多个列来标识行,请使用以下命令:
UPDATE images
SET sort = CASE CONCAT(full_path, '/', name)
    WHEN 'path/x' THEN 1
    WHEN 'path/y' THEN 2
    ...
    ELSE sort
    END

09-28 14:04