1

私は動的なデータベースの数値フィールドを介して順序付けられた小さなリストシステムを書いています

データベースには次のものがあります。

Id | position | person 
======================
1  | 3        | John 
2  | 1        | Jane
3  | 4        | David
4  | 2        | Emily

そのリストを選択すると、位置フィールドで並べ替えられます。私がやりたいのは、バックエンドを介してこの注文を管理することです。私が主な原則を下に置いている間、私が苦労していることの1つは、誰かが更新して、その注文リストの他の人を変更せずにエミリーを3に変更する状況です。

したがって、注文を更新するページには、人の名前と現在の注文が含まれるテキストボックスがあります。

これを処理する方法を模索したいのですが、すべてが一度に保存されるため、どの項目が変更されたかを判断する方法がないため、これを行うための可能な方法を把握できないようです。したがって、正しいはずです。重複の場合は1つ。

何か案は?

4

4 に答える 4

0

私はこのように並べ替えます:

...order by position, person

そうすれば、同じ「位置」を持つ人々は、引き続き確実に(名前で)注文されます。「修正」はユーザーに任せてください。

もちろん、これを処理する最良の方法は、「位置」フィールドでユーザーをまったく煩わせるのではなく、ある種のドラッグ可能なソート可能なリストを使用することです。

于 2012-07-17T08:18:38.667 に答える
0

これは、
最初に使用する例です。行の位置を変更し、例として使用calendar_event_id = 7してから、実行する再配置を呼び出します。

SET @position = 0;
UPDATE calendar_events SET position = @position := @position + 1 
WHERE position >= 0 
ORDER BY position, IF(calendar_event_id = 7, 0, 1), name

行を削除した場合は、そのIF(calendar_event_id = 7, 0, 1),部分をスキップするだけです

于 2012-07-17T08:26:26.017 に答える
0

エミリーをリストの下に移動したい場合、彼女の位置 2 は 3 になります。したがって、3 を 2 に戻す必要があります (これはエミリーの位置でした)。

リストを上に移動する場合も同様です。基本的に、次/前のレコードの位置を交換しています。ただし、スワップするレコードがあることを確認する必要があります。

疑似コードを下に移動:

  1. エミリーをゲット
  2. Emily の下のレコードを更新 (Emily の位置 +1)
  3. IF が正常に更新されました - エミリーの位置を更新します
于 2012-07-17T08:24:17.877 に答える
0

リストを手動で並べ替えるロジックの 1 つは、リストの 1 つの位置が変更されるたびに、関連するリスト アイテム全体を並べ替えるというものです。10 を 2 に変更するには、2 から 9 までのすべてを +1 ポジション前に押す必要があるため、ロジックは次のようになります。

for i in new pos+1..old pos
    pos[i]++
于 2012-07-17T08:24:57.933 に答える