- ベストアンサー
データベースのデータの持たせ方・取得方法について
- MySQLを使用してWebアプリ開発を行っているときに、ユーザ情報として趣味を最大5件(3件は必須)で入力できるようにしたい場合、どのようにデータを持たせるべきか悩んでいます。テーブルAとテーブルBを使用することを考えていますが、他にも良い方法があれば教えていただきたいです。
- ユーザは自由に入力ボックスに値を入力し、登録ボタンが押されると、テーブルBを検索してヒットすればそのIDをテーブルAに登録し、ヒットしなければテーブルBに新規登録し、そのIDをテーブルAにも登録する仕組みで考えています。
- また、このデータ構造でユーザ名と趣味1〜5の趣味名を一覧表示する場合、どのようなSELECT文でデータを取得するべきかわかりません。テーブルAとテーブルBをJOINして、結合したカラムを取得する方法を教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>ユーザ名、趣味名1、趣味名2、趣味名3を表示させたい 意図がよくわかりませんが5個登録されていても3つだけ表示したいということでしょうか? もし単純に全ての趣味を表示してよいならこんな感じで //準備 create table user(uid int not null primary key,uname varchar(100)); insert into user values(1,"佐藤"),(2,"鈴木"),(3,"田中"),(4,"吉田"); create table hobby(hid int not null primary key ,hname varchar(100)); insert into hobby values(1,"テレビ"),(2,"ネット"),(3,"ゲーム"),(4,"ラジオ"),(5,"スポーツ"),(6,"スポーツ観戦"),(7,"映画鑑賞"),(8,"音楽鑑賞") create table user_hobby(uhid int not null primary key auto_increment,uid int,hid int,unique(uid,hid)); insert into user_hobby(uid,hid) values(1,1),(1,2),(1,3),(1,4),(1,5),(2,2),(2,5),(2,3),(2,1),(3,1),(4,2),(4,3),(4,5),(4,7),(4,8); //表示 select uname,group_concat(hname) as hnames from user as u inner join user_hobby as uh on u.uid=uh.uid inner join hobby as h on uh.hid=h.hid group by u.uid;
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
効率や検索性を考えるとこうかな? ■テーブルA(ユーザデータ) ・ユーザID ・ユーザ名 ■テーブルB(趣味マスタ) ・趣味ID・・・テーブルAの趣味ID1~5と紐づく ・趣味名 ■テーブルC(ユーザ趣味データ) ・ユーザ趣味ID(auto_increment) ・ユーザID ・趣味ID ロジック的には テーブルCを挿入・更新時、ユーザーIDに対して5件をオーバーしていたら ユーザ趣味IDの古い方から消していく もしくはユーザーIDに対して5件すでに登録されていたら、挿入できない 仕様にする
お礼
yambejpさん 助言ありがとうございます。 なるほど。テーブルCでユーザと趣味を関連させるということですね。 すごくわかりやすいです。 またこの場合に、 例えば、ユーザ名、趣味名1、趣味名2、趣味名3を表示させたい場合はどのようなSELECT文にすればよいでしょうか?分かるようであればご助言いただけると助かります。
お礼
ご教示いただきありがとうございました。 無事にできました。