mysql:8300
From: "Kawaji, Shinya" <"Kawaji, Shinya" <kawaji@xxxxxxxxxx>>
Date: Mon, 20 Oct 2003 13:46:30 +0900
Subject: [mysql 08300] Re: SELECT でローテーション出力したい
かわじ、です。 一つの考え方に過ぎませんが・・・ > 【目的】 > 1回のアクセス事に、順番に1レコードをブラウザに出力したい。 > また、「text_*」の部分もローテーション表示されたい。 要するにセッション毎に違うデータ(次のデータ)を取り出したい、ということ でしたら、もうひとつ数字のフィールドを増やして、表示毎にインクリメントす るというやり方もあると思います。 まず、そのフィールドを増やします。 ALTER TABLE text_tb ADD view_count UNSIGNED NOT NULL DEFAULT 0; そして表示毎に SELECT *, @tc := text_count FROM text_tb ORDER BY view_count,text_id LIMIT 1; とし、これで取得した text_id を用いて、 UPDATE text_tb SET view_count = view_count + 1 WHERE text_id = @tc; として、view_count を増やします。 簡単に言えばこんな感じですが、view_count が溢れたときのための対策が 必要なのと、上記の SELECT と UPDATE の間にはタイムラグが発生し得るので、 厳密に順序毎に表示したい場合は LOCK をかけたりする必要があります。 # view_count を数字型ではなく、他の種類の型にするという工夫も # あり得るかも・・・ フィールドを増やせないのなら、単純にその情報を入れるだけのテーブルを 作ってもいいかもしれません。 CREATE TABLE view ( text_id BIGINT UNSIGNED NOT NULL ); INSERT view values (0); 表示毎に UPDATE view set text_id = text_id + 1; SELECT *, @vc := view.text_id FROM text_tb LEFT JOIN view using (text_id) WHERE view.text_id is not null; 最初の UPDATE の際に、text_db.text_id < view.text_id となっていたら 1 に戻すなりの工夫が必要です。 # きっと、もっとスマートな解があるに違いない
8297 2003-10-20 05:22 ["Tatsuya Kondo" <kon] SELECT でローテーション出力したい -> 8300 2003-10-20 13:46 ┗["Kawaji, Shinya" <ka] 8301 2003-10-20 14:11 ┗[<lavlav@xxxxxxxxxx> ]