3

idcatnameおよびorderフィールドを含む 5 つの行があるとします。

+----+----------+-----+  
| id | catname  |order|
+----+----------+-----+  
|  1 | cat1     |   2 |
|  2 | cat2     |   1 |
|  3 | cat3     |   3 | 
|  4 | cat4     |   5 |
|  5 | cat5     |   4 |
+----+----------+-----+  

そして、これらの 5 つのカテゴリの順序を配列から更新したいと考えています。

array(1 => 3, 2 => 4, 3 => 5, 4 => 1, 5 => 2)

ベストプラクティスは何ですか? 各行を選択し、配列内の対応する注文で注文フィールドを更新するには? または、これらすべてのカテゴリの順序配列を含む新しいテーブルを作成し、それを使用して、たとえばユーザー ID を使用した結合ステートメントで 2 つのテーブルを順序付けおよびリンクするには?

4

3 に答える 3

2

1 つのクエリで実行する場合は、次のように SQL クエリを生成できます (キーが既存のorder値であると仮定します)。

$orders = array(
    1 => 3,
    2 => 4,
    3 => 5,
    4 => 1,
    5 => 2,
);

$sql = 'UPDATE category SET order = CASE order ';

foreach ($orders as $old => $new) {
    $sql .= "WHEN $old THEN $new ";
}

$sql .= 'END';

キーがidエントリの場合は、CASE id代わりに を使用しますCASE order

于 2012-05-02T09:13:03.763 に答える
1

新しい順序でそれらに負の値を割り当ててから、負の値に -1 を掛けることができます。

array(1->-3,2->-4,3->-3,4->-1,5->-2)

ただし、配列をループして、行をそれぞれ更新する必要があります。

update yourTable set order=-3 where order=1;

そして後で使用する

update yourTable set order=-1*order where order < 0;
于 2012-05-02T08:58:21.540 に答える
0

とにかく、選択/フェッチする行に注文データを入れることは、別のテーブルとの結合よりも確実に高速になります。更新に関しては、適切なインデックスが配置されていれば、それほど重要ではありません。したがって、私は 1 つのテーブル アプローチを使用します。

于 2012-05-02T08:53:40.093 に答える