2016-12-06 10 views
1

以下のコードは正常に動作しますが、これを処理する別の方法があるかどうかは疑問です。基本的に、エントリを削除した後、ソート順を更新する必要があります。How to - 削除後のソート順のソート

$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++; 
} 
+0

'set sort = sort-1'のような更新で計算できます。この方法で、ループする必要はありません。 – Jeff

+0

'sort'カラムの値を更新する前に、それらの値をどのように決定しましたか?あなたのアップデートは単に 'id'値と同じものに設定します。あなたはちょうど 'idによってSORTすることができ、それを1日と呼ぶことができます。 'id'の値が連続していないことを誰も知らないでしょう。あなたがそれらを教えない限り、' DELETE'dされているものもあります。 –

+0

私は別々のソート列を持つことを好みます。挿入時には合計行数がカウントされ+1が加算され、最新のエントリがソートの最後になります。 – drooh

答えて

1

はい、異なる(私がより良いと思う)方法があります:(あなたがそれを削除する前に、もちろん)

  1. は、削除済みアイテムのソート値を取得します。
  2. 更新あなたのケースのように、このことが何かを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ベースに開い可能性があり
注入。
準備文を使用する方が便利です!

+0

ありがとう、はい、$ category_idはプリペイドステートメントから取得されました – drooh

+0

このソリューションは、カテゴリが削除されたばかりで、残りの行の並べ替えを更新しているという事実を考慮していますか? – drooh

+0

削除されたものよりも「上に」あるものがすべてソートされます。私は編集しました。 – Jeff

0

使用変数と1つのステートメントでこれを置く:

SET @s := 0; 
UPDATE `ee_blog_category` 
    SET `sort` = (@s := @s + 1) 
    ORDER BY sort; 

を実際には、あなただけの削除1よりも大きいIDSのためにこれを行う必要があります。あなただけの1行削除する場合:

UPDATE ee_bloc_cateory 
    SET sort = sort - 1 
    WHERE sort >= (SELECT MIN(sort) FROM ee_bloc_cateory WHERE id = $deleted_id); 

を削除を行う前$deleted_idあるいは$deleted_sortを照会することができます。

+0

これは混乱しているように見えますが、物事をシンプルで読みやすいものに保つようなものです。しかし、おそらくこれは素晴らしい解決策です – drooh