• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:データベースのデータの持たせ方・取得方法について)

データベースのデータの持たせ方・取得方法について

このQ&Aのポイント
  • MySQLを使用してWebアプリ開発を行っているときに、ユーザ情報として趣味を最大5件(3件は必須)で入力できるようにしたい場合、どのようにデータを持たせるべきか悩んでいます。テーブルAとテーブルBを使用することを考えていますが、他にも良い方法があれば教えていただきたいです。
  • ユーザは自由に入力ボックスに値を入力し、登録ボタンが押されると、テーブルBを検索してヒットすればそのIDをテーブルAに登録し、ヒットしなければテーブルBに新規登録し、そのIDをテーブルAにも登録する仕組みで考えています。
  • また、このデータ構造でユーザ名と趣味1〜5の趣味名を一覧表示する場合、どのようなSELECT文でデータを取得するべきかわかりません。テーブルAとテーブルBをJOINして、結合したカラムを取得する方法を教えていただきたいです。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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;

k-igarashi5962
質問者

お礼

ご教示いただきありがとうございました。 無事にできました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

効率や検索性を考えるとこうかな? ■テーブルA(ユーザデータ) ・ユーザID ・ユーザ名 ■テーブルB(趣味マスタ) ・趣味ID・・・テーブルAの趣味ID1~5と紐づく ・趣味名 ■テーブルC(ユーザ趣味データ) ・ユーザ趣味ID(auto_increment) ・ユーザID ・趣味ID ロジック的には テーブルCを挿入・更新時、ユーザーIDに対して5件をオーバーしていたら ユーザ趣味IDの古い方から消していく もしくはユーザーIDに対して5件すでに登録されていたら、挿入できない 仕様にする

k-igarashi5962
質問者

お礼

yambejpさん 助言ありがとうございます。 なるほど。テーブルCでユーザと趣味を関連させるということですね。 すごくわかりやすいです。 またこの場合に、 例えば、ユーザ名、趣味名1、趣味名2、趣味名3を表示させたい場合はどのようなSELECT文にすればよいでしょうか?分かるようであればご助言いただけると助かります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • データベーステーブル設計

    簡単なアプリケーションを作ろうとしています。内容は、レストランのデータベースです。画面には、単純にレストラン名、住所、電話番号、営業時間、評価を表示させたいです。この「評価」は、このアプリケーションを使用する3人のユーザが入力する1~5の値の平均値としたいです(ユーザはメンテナンス画面から1レストランにつき1回まで評価値入力可能)。つまりユーザAが4、ユーザBが5、ユーザCが1を入力した場合、4+5+1/3=3.3を表示します。テーブルを設計した経験がないので教えてほしいのですが、この場合、どのようなテーブルを作れば最もシンプルできれいに出来るのでしょうか。まずレストランテーブルを作成する必要があると思いますが、「評価」があるために1テーブルでは不足だと思います。評価カラムの値はユーザが値を入力すれば変動することになるので、別テーブルを参照させるようにすべきなのでしょうか?評価テーブルというものを考えてみましたが、ユーザ名とレストランIDの複合をプライマリキーとし、評価値カラムをもたせるとしても、どこに平均値を持たせればいいのかわかりません。テーブル設計の模範例を教えて頂けると助かります。宜しくお願いします。

  • データベースの設計について教えてください。

    データベースの設計について教えてください。 基本的な質問ですみません。宜しくお願いいたします。 単純なテーブルで表現しますが、 パターンA、Bのどちらのテーブルで設計するのが良いのでしょうか。 DBはmysqlで5000万件のデータで検索のみのデータベースです。 【前提】 ユーザは複数のメールアドレスを持ちます。 画面から、このユーザのもつメールアドレスを表示させる仕様だとします。 【userマスタ】 (PK)ユーザID   ユーザ名   会社名 <パターンA> 【mailテーブル】 (PK)ユーザID (PK)ユーザメールアドレス   モバイル用アドレス <パターンB>  【mailテーブル】 (PK)ユーザメールアドレス   モバイル用アドレス   ユーザID ←インデックスをはります。

    • ベストアンサー
    • MySQL
  • データの取得方法

    Aテーブル{ id char(3) not null, name varchar(10), a_no char(5), b_no char(5), c_no char(5), date timestamp } Bマスタ{ no char(5), name char(10) } 上記のようなDBがあるのですがAテーブルのa_no、b_no、c_noに入るのはBマスタのnoになります。 下記のようにデータを取得したい場合、どうすればうまく取得できるのでしょうか。 A.id, A.name, A.a_no, カラム名をname1としてB.name, b_no, カラム名をname2としてB.name, c_no, カラム名をname3としてB.name そんなに難しいことではないと思うのですが、考えれば考えるだけ頭の中でこんがらがってきて困っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLでデータを1件だけ取得したいのですが。

    SQLでデータを1件だけ取得したいのですが。 以下のようなテーブルが2つあるとします。 ------------------------------------ テーブルA     テーブルB   値X           値X    値Y   1           1    20   2           2    NULL   3           2    60   4           2    70               4    NULL               4    NULL ------------------------------------ ここで、テーブルAの値Xと、テーブルBの値Xをリンクさせます。 テーブルAにデータがあれば、テーブルBに無くても出力します(外部結合イメージ) テーブルAの値Xに対して、テーブルBの値Xは2件以上リンクされる可能性があります。 この場合は1件のみ出力します。 その1件の決め方は、テーブルBの値YがNULLでは無く最大の物です。 但し値Yは全てNULLの可能性もあるので、その場合NULLとして1件出力します。 上記の出力イメージ ------------------------------------  値X    値Y  1    20  (1件の場合そのまま出力。1件がNULLでもそのまま出力)  2    70  (NULLではない最大の1件を出力)  3    NULL  (テーブルBになくても出力)  4    NULL  (値が全てNULLの場合、NULLとして1件出力) ------------------------------------ どのようなSQLを記載すれば実現可能でしょうか?

  • データ取得に関して

    以下の3つのテーブルがあったとします。 table1 ┌────┬───────┬──┬──────┬────┐ │●案件ID│●共有ユーザID│氏名│氏名フリガナ│利用者ID│ └────┴───────┴──┴──────┴────┘ table2 ┌────┬────┬───┬─────┬────┐ │●案件ID│登録者ID│登録日│パスワード│タイトル│ └────┴────┴───┴─────┴────┘ table3 ┌────┬────────┬─────┬───────┐ │●案件ID│●共有ファイルID│ファイル名│ファイルサイズ│ └────┴────────┴─────┴───────┘ table1の利用者IDのみを指定して、 table2.タイトル table3の該当案件IDのカウント数、 table3の該当案件IDのカウント数が1の場合、ファイル名 を取得したいのですが、SQLがうまくかけません。 どなたかご教示お願い致します。 mysql5.0.41

    • ベストアンサー
    • MySQL
  • 異なるスキーマからデータを抽出するには?oracl、PL/SQL

    Oracle初心者です。検索してもなかなかhitしないので、質問させていただきます。 aaaとbbbというスキーマがあると仮定します。 aaaにはパスワードテーブル bbbにはユーザテーブルがあるとします。 ユーザテーブル、パスワードテーブルにはそれぞれuser_idカラムがあり、そのuser_idをキーにして、aaaのpasswordカラムのデータを取得したいと思っています。 sql*plusでbbbに接続して、作業をしています。 言語はPL/SQLを使用しています。 単純に SELECT a.password FROM aaa.パスワードテーブル a, bbb.ユーザテーブル b WHERE a.user_id = b.user_id とすれば良いのかと思っていたら、違うようで、オブジェクトが存在しないと言うエラーになりコンパイルが通りません。 このよう違うスキーマのテーブルを参照する場合、どのようにすれば良いのでしょうか?

  • Access 旧データを新データに入替する方法

    テーブルAとBがあるとします。 テーブルAには A固有ID、データX(旧データ) が入っており テーブルBには B固有ID、A固有ID、データX(旧データ)、データY(新データ) が入っています。 ※「データX」に変更がない場合、テーブルBに同ID(タプル)は存在しません。 これを、クエリで出力するときに ID、データ(最新のもの)を出力したいのですがどうすれば良いでしょうか? 説明下手ですいません。 【テーブルBにデータがない場合】 A固有ID→ID データX→データ データY→(存在しません) 【テーブルBにデータがある場合】 A固有ID→ID データX→× データY→データ

  • テーブルの列名をデータとして設定しておき取得する

    テーブルが2つあるとします。 テーブルAにはテーブルBの列名がデータとして登録されてます。 テーブルBには値が格納されてます。 テーブルA Key  field1  field2  field3 ------------------------------ 1   item2  item3  item5 2   item1  item2  item5 ------------------------------ テーブルB Key  item1  item2  item3  item4  item5 -------------------------------------------- 1    101   205    350   420   510 2    111   112    113   114   115 -------------------------------------------- ここでテーブルAとテーブルBへキーを指定して、 テーブルAのfield1~field3に登録されたすべての列名を元にテーブルBから値を取得したいです。 例として キー1を指定して取得すると 205,350,510 が取れます (item2,item3,item5の列名をテーブルAで指定した為) キー2を指定して取得すると 111,112,115 が取れます キーをパラメータとして与え、 できれば2つのテーブルを結合し、1回のSQLで取得する方法はありますでしょうか? (1回のSQLでなくても簡易であれば良いですが) よろしくお願い致します。

  • javaにてデータ取得

    JAVAカテゴリーで質問しようかこちらにしようか迷ったのですが。。。 あるテーブルを以下の様に内部結合しています。 select * from t_table a, t_table b where a.id=b.id and a.no=0 and b.no=1 この時、t_tableのあるカラムtestcolを取得したいとおもっております。 言語はjavaで、データベースはpostgreSQLです。 rs.getString("testcol"); rsはResultSetオブジェクトです。 これで、データは取得できるのですが、条件のt_tableの別名aのデータ が取得されます。別名bの方を取得したいと思い、単純に rs.getString("b.testcol"); 等としたら、「カラム名がありません」というエラーになりました。 getStringのパラメータとして、カラムインデックス(数値)も 指定できるので、それで行うと取得可能でした。 カラムインデックス指定ですと、プログラムのメンテナンス上支障をきたす ので、なんとか、カラム名の指定で行いたいと思っておりますが、 どうすればいいのでしょうか?

  • テキストボックス内に記入されたデータの取得方法

    お願いします。 画面にテキストボックスが500あります。 そのなかに入力されたデータだけを動的に取り出したいと思っています。 ※取り出してデータベース(mysql)へインサートします。 詳しくは、tableが複数あり其の中にそれぞれ特定のテキストボックスが存在しているようになっていますので、特定のテーブル単体では毎回列名は固定されています。 たとえば、一画面にAとBテーブルがあったとして、AとBのテーブル内に ○A→3つのテキストボックス(列名のこと) ○B→6つつのテキストボックス(列名のこと) があったとして、 まず、Aのテーブル内のテキストボックス2つに値を入力されたとします。(3つめのテキストボックスは入力されていない) また、同時にBテーブルのボックス3つに入力されたとします。(残り3ボックスは入力されていません) その際、入力されたAテーブルの2つのボックスに対応する列名(データベース内の)とVALUESの値(テキストボックス内に記入されたデータ)がINSERT文に記述されるような事を考えています。 また、Bテーブルでも同様にしたいと考えています。 つまり、入力されたボックスに焦点をあてて動的にINSERT文を作れないか?という事で、入力されていないテキストボックス名はINSERT文から省きたいと考えています。これを動的にしたいのです。 >strSql = strSql & "'" & textbox1.Text & "'," 上の文の「 textbox1.Text  」を入力されたテキストボックスから動的に変更出来ないのかが気になっています。 例えば 、3つのテキストボックスがありそのうち、1番目と2番目に入力があったとき、変数をiとして 1 と 2 が入るようにしたいので以下のように文が書けるのだろうか?? 「 textbox[i].Text 」 と思っています。