-1

これは MySQL に関する質問です。

次の構造のテーブルがあります。

reference
position
parent

すべてのアイテムには位置があり、各位置は 1 回だけ使用する必要があります。位置はインクリメントする必要があります (したがって、40 個のアイテムがある場合、位置は 1 から 40 まで移動する必要があります)。

ただし、このテーブルのデータはいたるところにあります (同じ位置が複数回使用されており、位置のない行もあります)。位置を再インデックスしてテーブルをリセットしたいと思います。これを行うときは、既存の注文を (完全でなくても) 尊重したいと思います (可能であれば - そうでない場合は、ポジションを破棄できます)。

------------------------------------------------------
|   reference     |      position      |   parent     |
|-----------------|--------------------|--------------|
|ASHDFNS          |2                   |89            |
|BSHDFNS          |2                   |89            |
|CSHDFNS          |1                   |89            |
|DSHDFNS          |100                 |89            |
|ESHDFNS          |8                   |89            |
|FSHDFNS          |22                  |89            |
|ASHDFNS          |1                   |11            |
|BSHDFNS          |22                  |11            |
|CSHDFNS          |333                 |11            |
|-----------------|--------------------|--------------|

望ましい

-------------------------------------------------------
|   reference     |      position      |   parent     |
|-----------------|--------------------|--------------|
|CSHDFNS          |1                   |89            |
|ASHDFNS          |2                   |89            |
|BSHDFNS          |3                   |89            |
|ESHDFNS          |4                   |89            |
|FSHDFNS          |5                   |89            |
|DSHDFNS          |6                   |89            |
|ASHDFNS          |1                   |11            |
|BSHDFNS          |2                   |11            |
|CSHDFNS          |3                   |11            |
|-----------------|--------------------|--------------|

編集:申し訳ありませんが、テーブルが複数の親内のアイテムの位置を説明しているため、位置列を自動インクリメントするだけでは機能しません (アイテムは複数の親を持つことができます)。

4

1 に答える 1

1

同様のスキーマでテーブルを作成しますが、列の位置を auto_increment にします

その後、必要な順序で old_table 順序から挿入します

insert into new_table select reference, 0, parent from old_table 
order by if (position is null, 99999, position);

その後、old_tableの名前を変更し、new_tableの名前をold_tableに変更します

それ以外の場合は、位置を表すユーザー変数を定義します

このように-mysqlで同じテーブルの問題を更新して選択します

またはこれ -行の位置が含まれるように列を更新する

于 2011-03-04T16:30:46.563 に答える