• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:データベースの作成)

データベースの作成方法と記録管理テーブルの設計

このQ&Aのポイント
  • データベースの作成方法や記録管理テーブルの設計について質問があります。
  • サークルメンバーのマラソン大会の記録管理テーブルを作成するための方法を知りたいです。
  • phpMyAdminを使用して一人の会員に対して複数の日付と記録を登録する方法について教えてください。

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

  • ベストアンサー
回答No.5

そうですね、select文とjoinの基本的な構文を調べて下さい。select文の中でselectが2回現れる事は絶対にありません。 それと記録テーブルの構造を少し考えた方がいいですね。full,half,10kmってどれもタイムですよね?そして人により存在しないデータもある訳ですよね?でしたら、僕が回答で示したように、マラソンの種類を定義して、タイムのフィールドを3つも並べない方が良いですよ。もしこの形式で行うのであれば、データが無い状態を明確に決めておかなければなりません。そうしないと「タイムが存在する/しない」を得る事が難しくなります。 仮にタイムが無い状態をタイム0とします。 select a.number,a.name,b.date,b.full from member as a,kiroku as b where b.date = '2005' and b.full > 0 and a.number = b.number 取得するレコードは恐らく一つなのでorder句は不要ですね。

kenkenkenken25
質問者

補足

ご回答ありがとうございます。wakame0729さんのおっしゃるようにテーブルの構造があまりよくないかもしれませんが、今回はそれでやってみようと思います。 membersテーブル(主キー:number)  number  name 1     A 2     B kirokuテーブル (主キー:number,date) number  date     full   half  10km 1    2005-5-22   2:55:21 1    2004-3-11        1:19:15 ここから、Aの2005年フルの記録を抜き出すという場合、教えていただいた方法でsqlを書いたのですが・・・ $sql = "select members.number,members.name kiroku.date,kiroku.$distance from members,kiroku where (members.name = $name) and (kiroku.date like '%$date%') and (members.number = kiroku.number)"; これだと同様にだめでした。オプションメニューで選択する際、会員番号の選択もするようにしないとだめなのでしょうか?

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

その他の回答 (5)

回答No.6

あ、いけない、会員番号1番、の指定を入れるの忘れてました。先の回答のSQLだと「フルマラソンのタイムが存在するメンバー」が一覧表示されるので、適宜orderでソートして下さい。

すると、全ての回答が全文表示されます。
回答No.4

left joinの行でテーブル指定が抜けました(^^; フルマラソンの記録がある会員のリストを得るには select 取得するフィールドリスト from 会員テーブル as a left join 記録テーブル as b on a.会員ID = b.会員ID where b.種類 = フルマラソン and b.会員ID is not null;

kenkenkenken25
質問者

補足

早速、sql文を作ってみたのですが、うまくいきませんでした。二つのテーブル(membersにはnumber(会員番号)name(名前)が入っていて、kirokuにはnumber(会員番号)、date(年度)、full(フルマラソンの記録) half(ハーフマラソンの記録)、10km(10kmの記録)が入っています) membersからは名前をkirokuからは年度別の記録を抜き出したいと考えています。 例えば、会員番号1番、Aさんの2005年のフルマラソンの記録を抽出するといった感じです。 それぞれオプションメニューで名前、年度、距離を選択することで結果が出力されるといったことを考えています。 sql文は以下のとおり作成したのですが、これだとだめでした。select をand でつなげるのはよくないのでしょうか? $sql = "select number,name from members and select date,$distance from kiroku where (kiroku.date like '%date%') and (members.number = kiroku.number) order by $distance"; よろしくお願いします。

すると、全ての回答が全文表示されます。
回答No.3

連携といってもどのような事を求めているのかわかりませんが、select文でjoinを使うと複数テーブルを連携させてデータを取得する事ができます。例えば、フルマラソンのタイムが3時間未満の人を表示するには select 取得するフィールドリスト from 会員テーブル as a,タイムテーブル as b where b.種類 = フルマラソン and b.タイム < '3:00:00' and a.会員ID = b.会員ID; フルマラソンの記録がある会員のリストを得るには select 取得するフィールドリスト from 会員テーブル as a left join on a.会員ID = b.会員ID where b.種類 = フルマラソン and b.会員ID is not null; てな感じです。色々なバリエーションがあるので研究してみて下さい。

参考URL:
http://dev.mysql.com/doc/mysql/ja/join.html
kenkenkenken25
質問者

お礼

ご丁寧なご説明ありがとうございます! 今から早速やってみますね!

すると、全ての回答が全文表示されます。
回答No.2

主キーはユニーク値でないと許されないのではなかったですか?この場合ですと会員番号、年度、種類の3つを主キーにしないといけないのでは?そして主キーで使う事を考えると、年度、種類は数値型にした方が良いと思いますよ。

kenkenkenken25
質問者

補足

そうでした!会員番号だけを主キーにするだけではだめでした。例えば会員番号を主キーにした場合、別のテーブル(会員番号、名前、性別、年齢というフィールドがあります)でも同じように会員番号を主キーにして、二つのテーブルの連携をとることは可能なのでしょうか?

すると、全ての回答が全文表示されます。
回答No.1

そのようなケースではテーブルを別けた方がいいですね。こういうケースは非常によくありますよ。 会員番号あたりをキーにして、マラソンの種類も数値で定義して 会員番号,種類,記録 こんなテーブルを作ってあげれば良いと思います。

kenkenkenken25
質問者

補足

ご回答ありがとうございます! テーブルを分けて作成していきます! ところで、phpMyAdminだと新しくテーブルを作る際に1つのフィールドにはひとつの数値しか入力できないのですが・・・ その場合は主キーである会員番号を何度もつけて以下のようにやればよいのでしょうか? 会員番号  年度  マラソンの種類 記録 1     2005    フル     2:55:47 1     2005    フル     3:05:21 1     2004    ハーフ    1:26:19 2     2005    10km     47:12 2     2003    フル     4:32:21 という風なテーブルの作成の仕方でよいでしょうか? よろしくお願いします。

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