タイトルの通り
MySQLでこういう場面がありました。
- 特定カラムを元にレコード数取得したい
- そのとき特定の値だけ持つのだけ抽出したい
この方法が分からなくて数時間なやんだことがあります。
でもやっと方法が分かったので、
ここでは MySQLで特定値を持つレコード数取得のやり方 を紹介!
やり方さえ分かれば、それほど難しくありません。
COUNT を使って実現したかったこと
たとえば仮に、次のテーブルを作るとします。
- idカラム : ユニークなID
- nameカラム : ユーザー名
- countryカラム : 3文字の国コード
仮だけど、よくある感じのユーザーテーブルです。
実際に次のようなSQLクエリを発行して作ってみました。
▼ 次のようなSQLからテーブル作成
1 2 3 4 5 6 |
CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(256), country VARCHAR(3), PRIMARY KEY (id) ); |
▼ そして適当なユーザーデータ挿入
1 2 3 4 5 6 7 8 |
INSERT INTO users (name, country) VALUES ( 'Tanaka', 'JPN' ), ( 'Tomy', 'USA' ), ( 'Satou', 'JPN' ), ( 'Watanabe', 'JPN' ), ( 'Henry', 'USA' ) ( 'Zhang', 'CHN' ); |
このテーブルは次のような構成になります。
▼ テーブルの中身
id | name | country |
1 | Tanaka | JPN |
2 | Tomy | USA |
3 | Satou | JPN |
4 | Watanabe | JPN |
5 | Henry | USA |
6 | Zhang | CHN |
このテーブルの country カラム
この値(JPN、 USA、CHN)ごとにレコード数取得したかったんです。
▼ イメージ図はこんな感じ
sum_of_usa | sum_of_jpy | sum_of_chn |
2 | 3 | 1 |
こういうデータが取りたかったんですよね。
同カラムの中でさらに分類ごとに合計を求めるみたいな。
特定値を持つカラムだけをCOUNTするには...SQL例
当然ながら、COUNT単体では無理
普通に COUNT(country) とかではレコード数が返るだけです。
ではどうすればいいのか・・・
その場合、次のように CASE WHEN ~ END を使えばOK
▼ countryカラムの値ごとに COUNT する例
1 2 3 4 5 |
SELECT COUNT(CASE WHEN country = 'USA' THEN country END) AS sum_of_usa, COUNT(CASE WHEN country = 'JPN' THEN country END) AS sum_of_jpn, COUNT(CASE WHEN country = 'CHN' THEN country END) AS sum_of_chn FROM users; |
このSQLの sum_of_usa の場合なら・・・
- もし country = 'USA' なら country を返す。
- もし country != 'USA' なら何も返さない
このように値ごとに COUNT が可能という訳です。
実際にこのクエリを実行した結果がコチラ
sum_of_usa | sum_of_jpy | sum_of_chn |
2 | 3 | 1 |
うん、、ちゃんと値ごとにカウントできてます。
1つのクエリだけで取得できるのが便利かもしれない。
サブクエリとかも使う必要ありません。
ここまでのまとめ
大事なポイントだけまとめると次の通り
- 普通に COUNT は使えない
仮に COUNT(country) とすると、そのカラムを持つレコード数合計が返る。
特定の値(カテゴリーとか)で合計を出したいなら一工夫が必要 - CASE WHEN ~ END を使えばOK
たとえば COUNT(CASE WHEN country = 'USA' THEN country END) みたいな感じ。
これだけで同じ値を持つカラムのレコード数だけ取得できる。
以上、MySQLで特定値を持つカラムだけCOUNTする方法でした。
もし コード間違い、もっといい方法等あれば教えてください。ではまた