- ベストアンサー
データベースを指定箇所に挿入する方法
このたびMySQL+PHPの勉強を始め、映画作品の情報を管理するデータベースを作成しているのですが、データの管理の部分で悩んでいます。 レコード1 作品A レコード2 作品B レコード3 作品Bの続編1 レコード4 作品C レコード5 作品Aの続編1 レコード6 作品Aの続編2 という順番でテーブルに登録された場合、以下のように順番通りに表示したいと思っています。 1 A 2 Aの続編1 3 Aの続編2 4 B 5 Bの続編1 6 C そのためには、MySQL内でwhere構文などを使って並び替えをしたり、PHPで処理をしたりして順番を定めなければなりません。 そうすると、表示のたびに処理に負荷がかかってしまうため、新たにデータを挿入する際に、指定した場所にレコードの追加を行えるようにしたいと思っています。 レコード1 作品A (ここに「作品Aの続編」を挿入) レコード2 作品B ↓ レコード1 作品A レコード2 作品Aの続編 レコード3 作品B という処理はINSERT構文を使って可能なのでしょうか? 色々と調べてみたのですが、INSERTではレコードの最後に追加するというのしか理解できませんでした。 ぜひ、お答えをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問にあるような、順番を指定して挿入という事はできません、というか、概念的にそういう考え方はありません。この場合は、テーブル構造を工夫する事で望みの事ができると思います。 IDを二つ作ると良いでしょう。作品IDと、その中での続編IDです。例えば 作品ID 続編ID タイトル 1 1 作品A 1 2 作品Aの続編1 1 3 作品Aの続編2 2 1 作品B 3 1 作品C 3 2 作品Cの続編 このような構造にします。そしてprimary keyを(作品ID,続編ID)にする、または(作品ID,続編ID)というインデックスを作成する事で、検索やソートが速くなります。
その他の回答 (2)
私の知る限りはinsertした順番やinsertの構文で表示順番を保障する方法はSQLにはありません。 順番を指定するにはselect文のorder by句だけです。 そのため何らかの順番で表示させたいという要件があるのなら、そのためのカラムを必要とします。 たしかにorder byを指定せずにselectすると一見insertした順番に出てきますが、これは最初のうちだけだと思ってください。deleteしたりupdateしたりしているうちにこの順番は保障されなくなります。 私なら ID:ただの連番 作品コード:同一作品なら同じ番号が入るコード 作品名:作品の名称 作品順番:同一作品での順番 公開年月日 などとします。 #1さんの方法と違いますが、他にどういう要件があるかによって論理設計は変わりますから、いろいろと検討してください。
お礼
お答えありがとうございます! #2の方で順番という概念はないということを知りましたが、改めてありがとうございます。 order by句を指定していなかったので、気をつけたいと思います。 設計は難しいなぁと思っている日々です。 色々と検討をして勉強していきたいと思っております。 どうもありがとうございました。
- moon_night
- ベストアンサー率32% (598/1831)
不可能です。 Mysqlではデータに保存される領域や順番は保証されていません。 やるとするならば、他にデータ表示フィールドを持たないとできません。 order by 句を使って並び替えましょう。 余談ですが、私なら ID | 作品 | 表示順番 | 続編フラグ(ID) みたいな感じで、 作品と続編は一まとめにしてしまいます。 (元IDから続編を引っ張ってこれるように)
お礼
お早い回答ありがとうございます。 そうですか、どうりで探しても見つからなかったわけですね… 作品管理のレコードはmoon_nightさまのように続編フラグ(ID)のようなものをつけていたのですが、やはり表示のたびに並び替えをするというのに抵抗を受けてしまいまして…。 お答えありがとうございました。
お礼
お早い、お答えありがとうございます。 そういう概念すらなかったのですね。勉強になりました。 なるほど!そのような二つのキーで自動的に順番どおりになりますね!! どうもありがとうございました!