人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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のものが何度も表示されてしまいました


●質問者: sun-chan
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:echo MySQL SELECT SQL Web
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● chuken_kenkou
●35ポイント

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 構文

◎質問者からの返答

ありがとうございます。

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...


2 ● chuken_kenkou
●35ポイント ベストアンサー

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列とhizuke列で、表と表が対応付けられています。4表とも id と hizuke はあります。対応しています。


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

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


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

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

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


もしかしたら

$row["hizuke"];

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

$row["diary.hizuke"];

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

うーん・・・

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ