MySQLの複数テーブル(3つ以上)の利用について教えてください。(手元のSQL参考書には「3つ以上のテーブルを利用する場合、2つを結合し、それと3つ目を結合するような形式をとる」とあるのですが、例がなく分かりませんでした)


diary, benkyo, undou, hobby という4つのテーブルに、フォームから入力します。全4テーブルのid, hizuke だけは共通です

これを1日分ずつまとめて web に表示する場合、どう読み込めばいいのでしょうか

$sql = "select * from diary, benkyo, undou, hobby inner join order by id";
(略)

if($rows == 0){
echo "該当データなし";
}
else {
while ($row = mysql_fetch_array($result)){
echo $row["hizuke"]; // diaryから
echo $row["benkyo_jikan"]; // benkyo から
echo "(あとは省略)";
}
}

これでは同じidのものが何度も表示されてしまいました

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2007/05/08 15:35:31
  • 終了:2007/05/09 09:42:44

ベストアンサー

id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/05/08 17:29:49

ポイント35pt

select xxxxx from の xxxxx には以下で必要になる列を書くのですよね?

上の例の場合、必要なデータは、

diary.hizuke, diary.nikki_text, benkyo.benkyo_jikan, undou.undou_jikan, hobby.hobby_name, hobby.hobby_jikan と数が多い(実際のデータでは id を除いて30個ぐらいあります)のですが、全て明記したほうがいいんでしょうか。

「*」指定だと、id列、hiduke列が各表分、重複して出てしまいます。それでも構わなければ、「*]指定でもいいです。

as d, as b, as u, as h がちょっとわからないですが

SQLの記述を簡略化するために、回答例では別名を付けました。表名でそのまま指定しても構いません。

データを読み込めな(該当データがない)かったです。

4表には、必ず対応するデータが1行以上ずつあるのでしょうか?

inner joinでは対応する行がなければ、ヒットしません。

対応する行がなくても検索したい場合は、left join等を使用してください。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.1.1 JOIN 構文

id:sun-chan

ありがとうございます。

id列とhizuke列で、表と表が対応付けられています。4表とも id と hizuke はあります。対応しています。


left join でもやってみたのですが、うまくいかないんですよね…

→ 追記です。他の部分も間違っていたのか、また left join を試してみたらうまくいきました!


もしかしたら「対応」の意味を私が取り違えているのかなあ・・・

一つのフォームから、4つの表に一斉にそれぞれインプットされるので、idとhizukeは全く同じになってます。

* 指定のところは、数は多いですが、重複はよくなさそうなので、* 指定ではなく、それぞれの列の名前を明記することにします。


もしかしたら

$row["hizuke"];

のところが間違ってるんでしょうか。

$row["diary.hizuke"];

とか書いたほうがいいんでしょうか・・・

うーん・・・

2007/05/09 09:42:14

その他の回答(1件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542007/05/08 16:42:35

ポイント35pt

id列とhizuke列で、表と表が対応付けられているのですか?

4表の対応付けは、例えば以下のような記述になります。

select
  d.id,d.hiduke, ~その他の列~
 from diary as d
 inner join benkyo as b
  on d.id=b.id and d.hizuke=b.hizuke
 inner join undou as u
  on d.id=u.id and d.hizuke=u.hizuke
 inner join hobby as h
  on d.id=h.id and d.hizuke=h.hizuke
 order by d.id

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.1.1 JOIN 構文

id:sun-chan

ありがとうございます。

select xxxxx from の xxxxx には以下で必要になる列を書くのですよね?

上の例の場合、必要なデータは、

diary.hizuke, diary.nikki_text, benkyo.benkyo_jikan, undou.undou_jikan, hobby.hobby_name, hobby.hobby_jikan と数が多い(実際のデータでは id を除いて30個ぐらいあります)のですが、全て明記したほうがいいんでしょうか。

as d, as b, as u, as h がちょっとわからないですが、テーブルに別名をつけたほうがいいのでしょうか?

select * from diary inner join benkyo on diary.id = benkyo.id で4つつなぐ方法も試してみましたが、データを読み込めな(該当データがない)かったです。

http://msdn2.microsoft.com/ja-jp/library/ms191430.aspx

http://au-w3.aomori-u.ac.jp/staff/tsunoda/dbprog/practice/sql_ma...

2007/05/08 17:07:30
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/05/08 17:29:49ここでベストアンサー

ポイント35pt

select xxxxx from の xxxxx には以下で必要になる列を書くのですよね?

上の例の場合、必要なデータは、

diary.hizuke, diary.nikki_text, benkyo.benkyo_jikan, undou.undou_jikan, hobby.hobby_name, hobby.hobby_jikan と数が多い(実際のデータでは id を除いて30個ぐらいあります)のですが、全て明記したほうがいいんでしょうか。

「*」指定だと、id列、hiduke列が各表分、重複して出てしまいます。それでも構わなければ、「*]指定でもいいです。

as d, as b, as u, as h がちょっとわからないですが

SQLの記述を簡略化するために、回答例では別名を付けました。表名でそのまま指定しても構いません。

データを読み込めな(該当データがない)かったです。

4表には、必ず対応するデータが1行以上ずつあるのでしょうか?

inner joinでは対応する行がなければ、ヒットしません。

対応する行がなくても検索したい場合は、left join等を使用してください。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.1.1 JOIN 構文

id:sun-chan

ありがとうございます。

id列とhizuke列で、表と表が対応付けられています。4表とも id と hizuke はあります。対応しています。


left join でもやってみたのですが、うまくいかないんですよね…

→ 追記です。他の部分も間違っていたのか、また left join を試してみたらうまくいきました!


もしかしたら「対応」の意味を私が取り違えているのかなあ・・・

一つのフォームから、4つの表に一斉にそれぞれインプットされるので、idとhizukeは全く同じになってます。

* 指定のところは、数は多いですが、重複はよくなさそうなので、* 指定ではなく、それぞれの列の名前を明記することにします。


もしかしたら

$row["hizuke"];

のところが間違ってるんでしょうか。

$row["diary.hizuke"];

とか書いたほうがいいんでしょうか・・・

うーん・・・

2007/05/09 09:42:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません