我有一个包含图像数据的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