SET a1 WHERE a AND b1 WHERE b和c1 WHERE c等

时间:2013-07-16 17:40:29

标签: php mysql arrays loops

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

1 个答案:

答案 0 :(得分:1)

我只是编写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')子句中的行。在这种情况下,您可以将 ELSE 部分保存在 CASE 中。

如果要使用多个列来标识行,请使用:

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