プロが教えるわが家の防犯対策術!

例えば、「好きな食べ物」というカラムに
 カレー、うどん
のように複数の値(文字列)を書くことは
 varchar(40)
のようにすれば、最大40文字まで可能ですが、文字列でなく複数の数値
 10,14,40
を記録するにはどのようにしたら良いのですか?

文字列として記録して、カンマで区切って取り出して数値に変換
すれば可能ですが面倒ですし、例えば、カラムを複数用意して
 ans1 int
 ans2 int
 :
 ans40 int
のようにすれば、用意した数だけ記録できますが、複数の数値といってもほとんどは2,3個なので、無駄が多い気がします。

「可変長の数列」というデータ型は無いのですか?作れないのですか?

A 回答 (3件)

一応サンプル、検索の仕方によってSQL文は微妙に変わっていきます



create table tbl_a(id int primary key,name varchar(10));
insert into tbl_a values(1,'A'),(2,'B'),(3,'C');
create table tbl_b(id int,val int,unique(id,val));
insert into tbl_b values(1,10),(1,14),(1,40),(2,10),(2,20);

※単純に汎用性を考えるとこう

select * from tbl_a as t1
left join (select id,group_concat(val) as vals from tbl_b group by id) as t2
on t1.id=t2.id
where t1.id=1

※効率を考えるとサブクエリをgroup byせずにt1にもt2にも同じidを指定する方がよい
select * from tbl_a as t1
left join (select id,group_concat(val) as vals from tbl_b where id=1) as t2
on t1.id=t2.id
where t1.id=1
    • good
    • 0
この回答へのお礼

回答ありがとうございます

動作確認しました。汎用性のある方法で where t1.id=1 を外した

select * from tbl_a as t1
left join (select id,group_concat(val) as vals from tbl_b group by id) as t2
on t1.id=t2.id

では正に、 tbl_aに固定長の項目 と tbl_bに可変長の数値項目 が合体されたテーブルとして振る舞うんですね

また、効率を考慮した2つ目の方法では、
 各レコード毎に毎回、別テーブルを検索して、複数回答を取り出して、絞り込むのではなく
 可変長のtbl_bの検索を where id=1 で制約をかけることで、最終結果に影響する部分だけ
を取り出しているので、効率がよいということですね。

完璧な回答、いつもながら感謝です
ありがとうございました

お礼日時:2020/04/23 09:53

一つのカラムに複数の数値を文字列として収めるのはあまり頭のいいやり方ではありません


ただどうしてもその運用方法しか無いのであれば単にカンマ区切りの
文字列として保持してください。
mysqlの場合はjson型という形式で配列のようなデータを保持することもできます
(運用的には効率的でも、DB的な効率性は低いですが)

あとは別テーブルで可変長のデータをid,valueの形式で保持してjoinしながら使うという手もあります
    • good
    • 0
この回答へのお礼

yambejpさま、いつも回答ありがとうございます

>別テーブルで可変長のデータをid,valueの形式で保持してjoinしながら使うという手もあります
なるほどです。
各レコード毎に毎回、別テーブルを検索して、複数回答を取り出すわけですね。
効率悪そうですが、DB的にはそのようにするのですね。

余談;どうしてもC言語的な解決策
 int *好きな食べ物リスト;
 好きな食べ物リスト[0] に回答数
 好きな食べ物リスト[1]以降に実際の回答の数値
しか思いつかなくて、いつも困っています。

お礼日時:2020/04/22 10:18

https://www.dbonline.jp/mysql/type/index8.html
上記が参考になりそうです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
SET型は、選択肢の集合が既知であり、それらの選択・非選択を記録するのですよね。
直接の解決方法ではありませんが、参考にさせていただきます

お礼日時:2020/04/22 10:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す