
例えば、「好きな食べ物」というカラムに
カレー、うどん
のように複数の値(文字列)を書くことは
varchar(40)
のようにすれば、最大40文字まで可能ですが、文字列でなく複数の数値
10,14,40
を記録するにはどのようにしたら良いのですか?
文字列として記録して、カンマで区切って取り出して数値に変換
すれば可能ですが面倒ですし、例えば、カラムを複数用意して
ans1 int
ans2 int
:
ans40 int
のようにすれば、用意した数だけ記録できますが、複数の数値といってもほとんどは2,3個なので、無駄が多い気がします。
「可変長の数列」というデータ型は無いのですか?作れないのですか?
No.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
回答ありがとうございます
動作確認しました。汎用性のある方法で 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 で制約をかけることで、最終結果に影響する部分だけ
を取り出しているので、効率がよいということですね。
完璧な回答、いつもながら感謝です
ありがとうございました
No.2
- 回答日時:
一つのカラムに複数の数値を文字列として収めるのはあまり頭のいいやり方ではありません
ただどうしてもその運用方法しか無いのであれば単にカンマ区切りの
文字列として保持してください。
mysqlの場合はjson型という形式で配列のようなデータを保持することもできます
(運用的には効率的でも、DB的な効率性は低いですが)
あとは別テーブルで可変長のデータをid,valueの形式で保持してjoinしながら使うという手もあります
yambejpさま、いつも回答ありがとうございます
>別テーブルで可変長のデータをid,valueの形式で保持してjoinしながら使うという手もあります
なるほどです。
各レコード毎に毎回、別テーブルを検索して、複数回答を取り出すわけですね。
効率悪そうですが、DB的にはそのようにするのですね。
余談;どうしてもC言語的な解決策
int *好きな食べ物リスト;
好きな食べ物リスト[0] に回答数
好きな食べ物リスト[1]以降に実際の回答の数値
しか思いつかなくて、いつも困っています。
No.1
- 回答日時:
上記が参考になりそうです。
回答ありがとうございます
SET型は、選択肢の集合が既知であり、それらの選択・非選択を記録するのですよね。
直接の解決方法ではありませんが、参考にさせていただきます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Excel(エクセル) Excel2019 列と列(2列)の数値の重複を調べたい 1 2023/05/11 13:35
- Excel(エクセル) Excel 条件付き書式について 1 2022/12/14 20:38
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
- Excel(エクセル) エクセルで重複データから重複を削除して指定の列に抽出したい 11 2022/05/11 11:26
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数テーブルのGROUP BY の使い...
-
フリーマーケット!
-
ローカルルーターモードとは
-
bashスクリプトで特定の文字に...
-
mysqlについて
-
尾形光琳の作品が見たい!
-
製品の最安店舗を取りたい。
-
レコードセットに新規追加する
-
EXISTSでの列名指定
-
データベース内の値をweb内でテ...
-
Dell Latitude C600に合うメモ...
-
JOIN後同一名カラムから値がと...
-
ストアド内でカラム名一覧を取得
-
SQLServerでのデータディクショ...
-
INSERT時の大小比較を含む重複...
-
このSQL文の意味を教えてくださ...
-
verilogに適したvimの設定を探...
-
正規表現を使って前方一致置換...
-
最小値をUPDATE
-
MySQLでvarcharに先頭ゼロをセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
WordpressのContact form 7でzi...
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
クエリ表示と、ADOで抽出したレ...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
SQL Left Join で重複を排除す...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] UNIQUE制約の値を更新...
-
inner joinをすると数がおかし...
-
1テーブル&複数レコードの更新...
-
Access パラメータクエリをcsv...
-
期間の重複を調べるSQL文につい...
-
Unionした最後にGROUP BYを追加...
-
Updateの複数テーブル条件時のL...
おすすめ情報