みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

mysqlでカンマデータのgroup by

初めての質問になります。

以下のようなテーブルで、dataカラムにカンマ区切りのデータを保存しているのですが、こちらはgroup byやcount等を使ってSQL一発で集計結果を取得できるのでしょうか?

SELECT count(*) FROM TEST WHERE FIND_IN_SET('1', data)で1から順番に取得は出来るのですが、数が多いとちょっといかがなものかと思い、質問させていただきました。
環境:mysql5.5

------------
|data
------------
|1,2,3
------------
|1,2,10
------------
|1,2,3,10
------------

期待する結果は以下のような感じです。

1|3
---------
2|3
---------
3|2
---------
10|2

投稿日時 - 2014-04-17 17:09:08

QNo.8558231

すぐに回答ほしいです

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

>dataカラムにカンマ区切りのデータを保存している

いや、SQLでそれはあり得ない・・・
こうしてみて

//テストデータ
create table tbl(id int not null auto_increment primary key,groupid int,data int);
insert into tbl(groupid,data) values(1,1),(1,2),(1,3),(2,1),(2,2),(2,10),(3,1),(3,2),(3,3),(3,10);

//カンマ区切り表示
select groupid,group_concat(data order by data) as datas from tbl group by groupid;

//data単位で集計
select data,count(*) as count from tbl group by data;

投稿日時 - 2014-04-17 18:24:52

お礼

早速のご回答ありがとうございました!
よく求人サイトなどで、「未経験可」「交通費支給」「時給1000円以上」といったオプションがあると思うのですが、そのデータをカンマ区切りで保存していました。
それで、そのオプションにマッチする企業が何件あるか?みたいな感じで使おうと思っていました。

ですので実際のテーブルはこんな感じです。(一部カラム省略)

create table tbl
(
conpany_id int not null auto_increment primary key,
conpany_name text not null,
service varchar(26),
・・・
);

// オプション配列
$options = array(1 = '未経験可', 2 = '交通費支給', 3 = '時給1000円以上', ・・・);

基本的にテーブル設計がイマイチだったんですね。。
tblテーブルからserviceカラムを削除し、ご教授いただいた項目で別テーブルを作成することで解決しました!

group_concatは今まで使ったことが無く、テーブル設計もまだまだ未熟なので非常に良い勉強になりました!
ありがとうございました!

投稿日時 - 2014-04-17 18:59:39

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問