• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:mysql について質問です)

MySQLで100万件のデータから特定のカラムの出現数を効率的にカウントする方法

このQ&Aのポイント
  • MySQLで100万件のデータから特定のカラムの出現数を効率的にカウントする方法について質問です。
  • 質問者は、date(作成日時)で縛り、int(0から5)の出現数をカウントする命令を実行していますが、効率が悪いと感じています。
  • 質問者は今後はintの範囲を固定ではなく可変にしたいと考えていますが、方法がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

> max の分だけ集計したい 一度最大値を変数にとっておくのが楽かも (テンポラリテーブルは微妙な制限があるので) create temporary table fuga(`int` int); insert into fuga values(0),(1),(2),(3),(4),(5); select @max:=max(`int`) from fuga; //ここで@maxに最大値をとっておく select fuga.int,ifnull(count,0) as count from fuga left join (select `int`,count(*) as count from hoge where `date`='2013-08-13' group by `int`) as sub on sub.int=fuga.int where fuga.int =@max //絞り込み

oioippo
質問者

お礼

ありがとうございます おかげさまで希望通りの実装ができそうです ご教授いただきありがとうございました

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

もし >'2013-08-13' にある 数字を調べて それぞれの出現数を 数える ということであれば、0件のデータは抜き出さなくてよいですね? //データ作成 create table hoge(`id` int,`int` int,`date` date); insert into hoge values(1,2,'2013-08-13'),(2,2,'2013-08-13'),(3,4,'2013-08-13'),(4,1,'2013-08-13'); //表示 select `int`,count(*) as count from hoge where `date`='2013-08-13' group by `int` もしそうではなく、出現するかどうかわからない0~5に対する件数を調べるなら テンポラリテーブルなど一時的にデータを羅列したテーブルを用意すると良いでしょう create temporary table fuga(`int` int); insert into fuga values(0),(1),(2),(3),(4),(5); select fuga.int,ifnull(count,0) as count from fuga left join (select `int`,count(*) as count from hoge where `date`='2013-08-13' group by `int`) as sub on sub.int=fuga.int;

oioippo
質問者

補足

ありがとうございます 説明不足で すみませんでした 教えていただいた 命令で 期待通りのことが出来そうです それと もう一点 create temporary table fuga(`int` int); SELECT MAX(int) AS max table -- max の分だけ集計したい insert into fuga values(0),(1),(2),(3),(4),(5); select fuga.int,ifnull(count,0) as count from fuga left join (select `int`,count(*) as count from hoge where `date`='2013-08-13' group by `int`) as sub on sub.int=fuga.int; 可変にする。について MAX(int) で取得したところ迄 値を取得することは可能でしょうか。 MAX(int) の結果を取得して ループで回す。 ようなことが出来ればと思います。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

常識的にSQLにおいて横方向の集計結果を表示する意味はほぼありませんが こんな風ではダメなんですか? SELECT `int`,COUNT(*) as `count` FROM table WHERE date BETWEEN '2013-08-13' AND '2013-08-13' GROUP BY `int` それと「OR NULL」のくだりが何をしたいのかわからない また、おそらく勘違いだと思うのですが、 「COUNT(int = 0)」的な処理をする場合「SUM(int = 0)」にしないと カウントできませんよ

oioippo
質問者

補足

こちらの説明不足で申し訳ないのですが id int  date 1  2   2013-08-13 2  2   2013-08-13 3  4   2013-08-13 4  1   2013-08-13 とあった場合 count(*) 0 1 2 0 1 と表示されるようにしたいのですが 可能でしょうか OR NULL の件は こちらの記事を参考にさせていただきました ttp://www.softel.co.jp/blogs/tech/archives/3267 あまり意味を理解せず 使っていました

すると、全ての回答が全文表示されます。

関連するQ&A