- - PR -
最多取引先番号取得SQLの作り方を教えて下さい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-10 20:20
逆でした。すみません。 しかも、某有名掲示板(?)で模範解答が出てるし...orz select 品番, 仕入先番号 from 注文テーブル a group by 品番, 仕入先番号 having count(*) >= all(select count(*) from 注文テーブル b where b.品番=a.品番 group by 仕入先番号); 無許可でコピペ。(だってこっちの方がいいし。。) | ||||||||
|
投稿日時: 2007-09-11 10:16
非インデックス項目による GROUP BY はフルスキャンですので、
パフォーマンスチューニングには少し気をつけた方が良いです。 | ||||||||
|
投稿日時: 2007-09-11 15:54
今回のSELECT文にはWHERE句がないから、どっちにしろフルスキャンでいいんじゃないですか? WHERE句があればあったで、そっちの条件でインデックスを使わせたほうが効率が良い場合が多いでしょうし。 それはそれとして純粋な質問なんですが、MySQLのオプティマイザは、インデックス項目でGROUP BYすると、どのようにインデックスを上手に使ってくれるのでしょうか? | ||||||||
|
投稿日時: 2007-09-11 16:29
すみません間違いです。GROUP BYではなくWHEREです。 フルスキャンとなるサブクエリの呼び出し回数には注意すべき、 ということを言いたかったのです。 よっしーさんの挙げられたSELECT文は構文的に非常にエレガントです。
しかし、サブクエリがボトルネックになる可能性があると思い、 上記のような書き込みをしました。 | ||||||||
|
投稿日時: 2007-09-11 18:03
なるほど。 これはとてもわかりやすく、且つ「どうすれば、こんなことが考え付くのだろう?」と感心してしまいます。 ところで、ここでALL句を明示しているのは何故なのでしょうか? カーニーさん、こあらさんは、いろいろ勉強させていただきました。 ご心配の点については、確認したところ、インデックス項目となっていますのでパフォーマンスの心配はなさそうです。 _________________ R・田中一郎 - R.Tanaka.Ichiro’s Blog | ||||||||
|
投稿日時: 2007-09-11 18:24
ある品番, 仕入先番号の注文数が、 その品番の仕入先番号ごとの、どの注文数よりも大きい(つまり最多注文数) を検索するためです。 # 「=(イコール)」 は最多注文数レコードが自分自身を除外しないための条件です。 日本語にすると非常に分かりにくいですね。。。 | ||||||||
|
投稿日時: 2007-09-12 17:32
私が最初に掲示したクエリも、OVER句を使えると簡潔に書けるみたいです。
[編集] 「OVER句を使うと」を「OVER句を使えると」に編集 OVER句を使えるDBMSって結構少ないみたいなので。 [/編集] [ メッセージ編集済み 編集者: こあら 編集日時 2007-09-12 17:38 ] |