私は、行がposition
フィールドを持つMariaDB(MySQLと思う)データベースを持っています。したがって、たとえば、ユーザーがID 10の列が位置#1に移動することもできますデータベースの行順序フィールドをより効率的に管理する方法?
CREATE TABLE `ordered_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`owner` int(11) NOT NULL,
`data` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
`position` int(11) NOT NULL
PRIMARY KEY (`id`)
)
:この位置は変更できますが、常に連続している必要があり、そして1
簡素化されたテーブルスキーマで開始します。これにはもちろん、後続のすべての項目の並べ替えが必要です。それ以外の場合は、position
フィールドに重複があります。私は4つ以下のクエリでこれを行う方法を理解できません。
私の現在の解決策は以下の通りですが、それは非常に簡単ですが、はるかにエレガントな再注文の方法があると感じています。この例では、私は3
- を位置決めするために、ユーザ20により、ID32を持つ行を移動してい
SELECT position FROM ordered_data WHERE id = 32
によってcurrentPosition
を取得します。 - 私たちが作成しようとしているギャップを
UPDATE ordered_data SET position = position - 1 WHERE position > currentPosition AND owner = 20
で埋める。 - 行の新しい位置(3)のスペースを
UPDATE ordered_data SET position = position + 1 WHERE position >= 3 AND owner = 20
とします。 - ギャップに収まるように行の位置を更新します
UPDATE ordered_data SET position = 3 WHERE id = 32
。
すべての提案は大歓迎です。最初の2つのステートメントを副選択と組み合わせると、MySQLは更新と選択に同じテーブルを使用することについて不平を言っていました。
オーナーあたり10行を超える可能性は低いです。
グループあたり10行を使用しても、パフォーマンスは気にせず、最も簡単な(最も読みやすい)ソリューションを使用します。あなたはすでにそれを持っています。私はちょうど1,3,4,2に注文を変更します - これはまた、 '(所有者、位置)'のユニークなキーで動作します。 –
@PaulSpiegelリオーダーがうまくいかない(ストレートスワップが隙間を残してしまい、ポジションの周りに頭を浮かべるのは難しいですが)、DBレベルで強制するのが良いアイデアです。 – JakeSteam