1

我有一个带有图像数据的 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”附近使用的正确语法

4

1 回答 1

1

I just write the SQL part, you can build it from PHP:

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

Additionally you can filter the rows in the WHERE clause with AND name in ('x', 'y'). In this case you can save the ELSE part in the CASE.

If you want to use more than one column to identify your row, use this:

UPDATE images
SET sort = CASE CONCAT(full_path, '/', name)
    WHEN 'path/x' THEN 1
    WHEN 'path/y' THEN 2
    ...
    ELSE sort
    END
于 2013-07-16T17:46:47.813 回答