- PR -

レコードの順序(MYSQL)

1
投稿者投稿内容
ソラ
会議室デビュー日: 2004/08/27
投稿数: 16
投稿日時: 2004-12-08 13:57
こんにちは。
MYSQLを使用しているのですが、INSERT文で登録した順序のとおりに
レコードをセットしたいのですが、どうすればいいか教えてください。

現在は、KEYを「5,4,3,2,1」と登録しても
SELECT文で抜くと「1,2,3,4,5」と読み出されてしまいます。
カラムはひとつしか(KEYのみ)ありません。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-08 14:28
select * from table order by KEY desc;

後は、日時(datetime型)フィールドを造って、日付順に order by とか。
ひとむら
会議室デビュー日: 2004/09/02
投稿数: 2
お住まい・勤務地: 名馬狩町
投稿日時: 2004-12-08 14:33
すみませんが逆に質問させてください。

なぜ、データ登録順に表示させたいのでしょうか。

データベースを使用する以上、あなたはデータを物理的にどのように格納するかをデータベースに丸投げしているのです。そのかわり、データベースは単なるシーケンシャルアクセスでは効率が悪いデータ検索・更新処理をあなたに提供するのです。検索で返ってくる順番がデータ登録順でないとしても、それはデータベースが悪いのではなく、登録順を保持できるようなテーブル構造を設定しなかったあなたの責任です。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-12-08 14:36
ソラさん、こんにちは。

引用:

現在は、KEYを「5,4,3,2,1」と登録しても
SELECT文で抜くと「1,2,3,4,5」と読み出されてしまいます。


レコードの表示順は ORDER BY 句で指定します。「登録順」に並べたいなら、登録日時を格納するカラムを追加して、デフォルト値なりトリガなりを使用して現在時刻を放り込めばOKでしょう。
MySqlを知らないので、もしかしたら「ORDER BY指定がない場合は登録順に表示する」というようなオプションがあるのかも知れませんが、そういうものに頼ってしまうと、他のDBで仕事が出来なくなってしまいます(ってのは大袈裟か)。

【追記】
モロ被り…。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2004-12-08 14:46 ]
ソラ
会議室デビュー日: 2004/08/27
投稿数: 16
投稿日時: 2004-12-08 14:50
すいません。質問の書き方が悪かったようです。
登録順というのは、「3,2,4,1,5」なら「3,2,4,1,5」と言う順番で
抜き出したいと言うことです。このばあい、ORDER BYではダメですよね?

なぜ、登録順かというと、順番待ちのテーブルを作りたかったのです。
順番がきたら、そのKEY番号(ID)をもつ別のテーブルのレコードを処理し、順番待ちからはレコードを削除すると言うことをしたいのです。
また、順番待ちをキャンセルすることも考慮すると、登録順にシーケンシャルなものが使えないかなぁ。とおもい、KEY項目だけのテーブルで登録順に抜き出せばいいか。と思ったからです。

AUTO_INCREMENTの項目を別に作り、そっちをKEYとすればよいのでしょうか?
AUTO_INCREMENTで、1,2,3,4,5,,,となっているところで、たとえば、「3」を削除した場合、次のAUTO_INCREMENTは、「6」になるのでしょうか?
DBが気を利かして欠番の「3」を使用するとちょっとまずいんですが・・・。
やってみます。

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2004-12-08 15:08
私はMySQLに詳しいわけではないですが、
AUTO_INCREMENTを使うよりも、DATETIMEの列を追加したほうが良いのでは?
連番で実現する場合、最大値に達したらどうするか?って事を考慮しなければならないので。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-12-08 15:30
引用:

AUTO_INCREMENTを使うよりも、DATETIMEの列を追加したほうが良いのでは?


キューを実装するのに、DATETIME型しか付けないのは問題です。DATETIME型には同じ時刻が入ってしまいますからね。ステートメント実行中 NOW() は常に同じ値を返すので、たとえば、一気に 10行挿入すると、時刻はすべて同じになってしまいます。

基本的には自動連番を主キーとし、参考情報として時刻を落とす。もしくは、自動連番 + 時刻の複合主キーにすることをおすすめします。
1

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