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