mysql:8431
From: "Kawaji, Shinya" <"Kawaji, Shinya" <kawaji@xxxxxxxxxx>>
Date: Wed, 26 Nov 2003 12:55:36 +0900
Subject: [mysql 08431] Re: 並び替えについての SQL 文
かわじ、です。 > > 1) フロントエンドで順位を数える。 > > (1行結果を取り出すごとに、順位の変数をインクリメントする) > > この方法は、テーブルにカラムを追加して、表示するたびに > UPDATEするという方法ですね。 > できれば毎回UPDATEをせずに取得したいのですが.. いや、それでも良いんですが、言わんとしていたことは、 テーブル内には順位は保存せず、表示などの処理の際にだけ、 アプリケーション側で順位を計算して、それを使用(表示)する という意味です。 「順位付け」そのものが、継続して使用するのではなかったら(アプリケーショ ンで毎回計算して良かったなら)、テーブルにカラムは用意しなくても いいと思います。 > > 2) 同じテーブルを join する(比較するものがダブっていないことが前提) > > select count(*) as rank, t1.name, t1.height > > from order_test as t1, order_test as t2 > > where t1.height >= t2.height > > group by t1.name, t1.height > > order by count(*) > > こちらの方法も試してみました。 > order byについてなのですが、前からcount(*)を指定すると下記のような > エラーが出ていました。 > > mysql > select count(*) as rank from order_test order by count(*); > ERROR 1111: Invalid use of group function サンプルが間違っていました。失礼しました。 "Invalid use of group function" というのは、「無効なグループ関数の使用」 ということで、今回の場合は order by にグループ関数を使っていたことが 良くなかったです。 ということで、実際には以下のようになります。 (height がユニークではない部分は、少しおかしくなっていますが) mysql> select count(*) as rank, t1.name, t1.height -> from order_test as t1, order_test as t2 -> where t1.height >= t2.height -> group by t1.name, t1.height -> order by rank; +------+------+--------+ | rank | name | height | +------+------+--------+ | 1 | F | 151 | | 2 | A | 162 | | 3 | B | 163 | | 6 | C | 164 | | 6 | D | 164 | | 6 | E | 164 | | 7 | H | 172 | | 8 | G | 175 | | 9 | I | 180 | +------+------+--------+ 9 rows in set (0.00 sec)
8419 2003-11-23 20:18 ["Kuroda, Akira" <AK1] RE: 並び替えについての SQL 文 8423 2003-11-25 11:51 ┗[Satoshi Iwanaga <iwa] 8427 2003-11-25 21:42 ┗["Kawaji, Shinya" <ka] 8428 2003-11-25 21:58 ┗[Satoshi Iwanaga <iwa] 8429 2003-11-25 22:31 ┗["Kawaji, Shinya" <ka] 8430 2003-11-26 11:21 ┗[Satoshi Iwanaga <iwa] -> 8431 2003-11-26 12:55 ┗["Kawaji, Shinya" <ka] 8432 2003-11-26 16:10 ┗[〓〓〓〓 〓〓 〓〓] Access のテーブルから入力すると #Deleted と表示される