- PR -

レコードの表示順序をカスタマイズするには

投稿者投稿内容
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-03-13 11:10
引用:

unibonさんの書き込み (2008-03-13 10:28) より:
UPDATE BOOKMARK SET DISPLAY_ORDER = DISPLAY_ORDER + 1 WHERE DISPLAY_ORDER >= 2
UPDATE BOOKMARK SET DISPLAY_ORDER = 2 WHERE DISPLAY_ORDER = 6
のようにして複数レコードを一括更新することで、UPDATE 文をレコード数にかかわらず常に2回で済ませられるような妄想も頭の中をよぎったのですが、こういうことってできるのでしょうかね?


それは面白いアイディアですね。
こんな感じで書けば1回で済みそうです。
コード:

UPDATE BOOKMARK
SET DISPLAY_ORDER = CASE
WHEN DISPLAY_ORDER = :old THEN :new
WHEN DISPLAY_ORDER > :old THEN DISPLAY_ORDER - 1
WHEN DISPLAY_ORDER < :old THEN DISPLAY_ORDER + 1
END
WHERE DISPLAY_ORDER BETWEEN :new AND :old OR DISPLAY_ORDER BETWEEN :old AND :new;


:oldと:newはそれぞれ変更対象のレコードの旧順序と新順序で置き換えてください。
単純追加と削除はやはり別途INSERT文とDELETE文の発行が必要になりそうですが、その場合にも他レコードの変更は:oldにとても大きい数値にしたり、:newを0にしたりすれば対応できそうです。

[ メッセージ編集済み 編集者: カーニー 編集日時 2008-03-13 13:10 ]

[ メッセージ編集済み 編集者: カーニー 編集日時 2008-03-13 13:10 ]
nikori
会議室デビュー日: 2008/03/13
投稿数: 11
投稿日時: 2008-03-13 11:12
たくさんのご意見ありがとうございます。

SQLやテーブル設計について不慣れで自信を持てずにいたのですが、
皆さんのご意見を伺って
テーブル設計でおかしなことをやっているわけではないことがわかり、
安心しました。
まずはこのテーブルで始めてみようかと思います。

引用:

UPDATE BOOKMARK SET DISPLAY_ORDER = DISPLAY_ORDER + 1 WHERE DISPLAY_ORDER >= 2
UPDATE BOOKMARK SET DISPLAY_ORDER = 2 WHERE DISPLAY_ORDER = 6
のようにして複数レコードを一括更新することで、
UPDATE 文をレコード数にかかわらず常に2回で済ませられるような妄想も頭の中をよぎったのですが、こういうことってできるのでしょうかね?


HSQLDBで実行できることを確認しました。
なるほど、こういうことができたのですね ^^;

またよろしくお願いします。
みなさん、どうもありがとうございました。
nikori
会議室デビュー日: 2008/03/13
投稿数: 11
投稿日時: 2008-03-13 11:55
indigo-xさん
ユーザが自分のブックマークの表示順序をWeb画面でドラッグ&ドロップして、
変更できるようなWebアプリケーションを作ってみたいと思っています。
引用:

私ならUpdateで、おそらくトランザクション系は動作していないと
思われるので5秒もあれば通常数千件はUpdateできますよ。
(DisplayOrderを変更したらを条件に入れたらBetter)


具体的な数字を出して頂きましてありがとうございます。、
数十程度のレコードしか想定していないので、
UPDATE実行による応答時間については心配しなくて大丈夫そうですね。

カーニーさん
実行確認しました(END CASEのCASEはいらない?)。
すごいです!
SQLおもしろいですね

どうもありがとうございました。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-03-13 13:12
引用:

nikoriさんの書き込み (2008-03-13 11:55) より:
カーニーさん
実行確認しました(END CASEのCASEはいらない?)。
すごいです!
SQLおもしろいですね



Yes, ...
ただのENDの誤りです。元コメント修正しておきました。

スキルアップ/キャリアアップ(JOB@IT)