質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

662閲覧

カンマ区切りで登録されたデータからランキングは出せますでしょうか?

akasatanaha

総合スコア44

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2021/08/05 11:48

以下のデータ形式の場合に、tag のランキングを出したい。
つまりテストが多い教科順に出力。
想定としては以下
教科,回数
算数,4
英語,3
国語,2
理科,1

CREATE TABLE `post` ( `id` int(11) NOT NULL, `name` varchar(200) NOT NULL, `tag` varchar(500) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- -- テーブルのデータのダンプ `post` -- INSERT INTO `post` (`id`, `name`, `tag`) VALUES (1, '朝のテスト', '国語,算数'), (2, '昼のテスト', '国語,算数,理科,英語'), (3, '研究テーマ', '算数'), (4, '夏季テスト', '算数,英語'), (5, '冬季テスト', '英語');

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論だけ示します。

sql

1select kamoku,count(id) as kaisuu from ( 2select id,substring_index(tag,',',1) as kamoku from post 3union select id,substring_index(substring_index(tag,',',2),',',-1) as kamoku from post 4union select id,substring_index(substring_index(tag,',',3),',',-1) as kamoku from post 5union select id,substring_index(substring_index(tag,',',4),',',-1) as kamoku from post 6union select id,substring_index(substring_index(tag,',',5),',',-1) as kamoku from post 7) as test group by kamoku order by kaisuu desc;

これの出力を以下に示します。

+--------+--------+ | kamoku | kaisuu | +--------+--------+ | 算数 | 4 | | 英語 | 3 | | 国語 | 2 | | 理科 | 1 | +--------+--------+ 4 rows in set (0.00 sec)

SQLを組み立てたときの思考回路

まず、科目とidの表がほしいと考えます。(擬似的に「第1正規形」に変換します)(第1正規形はデータベースの分野の専門用語です)

substring_indexを使うことでできることがわかりました。使い方は下の参考URLを見てください。
unionから始まる行がカンマ区切りで書かれる科目の個数分必要です。10科目書かれるなら10行必要です。行の中央付近で行ごとに2,3,4,5と増えているところをunionの行を増やして2,3,4,5,6,7,8,9,10とする必要があります。

sql

1select id,substring_index(tag,',',1) as kamoku from post 2union select id,substring_index(substring_index(tag,',',2),',',-1) as kamoku from post 3union select id,substring_index(substring_index(tag,',',3),',',-1) as kamoku from post 4union select id,substring_index(substring_index(tag,',',4),',',-1) as kamoku from post 5union select id,substring_index(substring_index(tag,',',5),',',-1) as kamoku from post;

下のような結果が得られます。

+----+--------+ | id | kamoku | +----+--------+ | 1 | 国語 | | 2 | 国語 | | 3 | 算数 | | 4 | 算数 | | 5 | 英語 | | 1 | 算数 | | 2 | 算数 | | 4 | 英語 | | 2 | 理科 | | 2 | 英語 | +----+--------+ 10 rows in set (0.00 sec)

あとはkamokuの出現数を求めるだけです。この表をfrom句に入れます(asで別名をつけないと怒られるのでas testってつけました。

sql

1select kamoku,count(id) as kaisuu from (ここに入れる) as test group by kamoku order by kaisuu desc;

そうすると最初に書いた結論の通りのSQL文になり、結果が出ます。

参考URL:

カンマ区切りの文字を分割する方法を調べた

この質問のコードがあった

投稿2021/08/05 15:40

編集2021/08/05 16:17
ktl2018

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktl2018

2021/08/05 16:20

ご指摘ありがとうございます。URLに関する記述を修正いたしました。
akasatanaha

2021/08/05 19:51

ご回答ありがとうございました! まさに求めていたものが実現いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問