Php 如何-sql在删除后更新排序顺序
下面的代码工作得很好,但我想知道是否有其他方法来处理这个问题。基本上,删除条目后,我需要更新排序顺序Php 如何-sql在删除后更新排序顺序,php,mysql,sql,Php,Mysql,Sql,下面的代码工作得很好,但我想知道是否有其他方法来处理这个问题。基本上,删除条目后,我需要更新排序顺序 $sql = 'DELETE FROM `ee_blog_category` WHERE id = '.$category_id; mysqli_query($con,$sql); if(mysqli_error($con)){ echo mysqli_error($con); } // update cat sort $i = 1; $sql = 'SELECT * FROM `ee_
$sql = 'DELETE FROM `ee_blog_category` WHERE id = '.$category_id;
mysqli_query($con,$sql);
if(mysqli_error($con)){
echo mysqli_error($con);
}
// update cat sort
$i = 1;
$sql = 'SELECT * FROM `ee_blog_category` ORDER BY `sort`';
$result = mysqli_query($con,$sql);
while ($row = mysqli_fetch_array($result)){
$sql1 = 'UPDATE `ee_blog_category` SET `sort` = '.$i.' WHERE `id` = '.$row['id'];
mysqli_query($con,$sql1);
$i++;
}
是的,有一种不同的方式(我认为更好):
sort=sort-1
$sql = "Select sort from ee_blog_category where id=$category_id";
// execute, fetch, catch errors...
$sort_original = $row['sort'];
// now update all the others
$sql = "UPDATE ee_blog_category SET sort=sort-1 where sort > $sort_original"; // maybe add a filter here (by group f.e.)
// execute, check for errors.
注意:您可以接受sql注入。
更好地使用事先准备好的语句 使用变量并将其放在一条语句中:
SET @s := 0;
UPDATE `ee_blog_category`
SET `sort` = (@s := @s + 1)
ORDER BY sort;
实际上,您只需要对大于已删除ID的ID执行此操作。如果只删除一行:
UPDATE ee_bloc_cateory
SET sort = sort - 1
WHERE sort >= (SELECT MIN(sort) FROM ee_bloc_cateory WHERE id = $deleted_id);
在执行删除操作之前,您可以查询
$deleted\u id
甚至$deleted\u sort
。您可以在更新中进行计算,如set sort=sort-1
。这样就不需要循环。在更新sort
列之前,您首先是如何确定它们的值的?您的更新只是将它们设置为与其id
值相同。您只需按id进行排序,就可以结束了。除非你告诉他们,否则没有人会知道你的id
值是不连续的——有些已经被DELETE
d了。我更喜欢有一个单独的排序列,在插入时计算总行数并加上+1,使最新的条目成为排序中的最后一个。好的,谢谢,是的,$category_id是从一个准备好的语句中获得的。这个解决方案是否解释了一个类别刚刚被删除的事实,并且它现在正在更新剩余行的排序?它正在对被删除行“上方”的所有行进行排序。等等,我错过了。。。我编辑..我编辑了答案,因为我忘记添加where sort>$sort\u original
。这看起来很混乱。。有点像保持事物简单易读,但这可能是一个很好的解决方案