MySQL・PHPに関する質問です。


以下の2つのテーブルを持ったデータベースがあります。

テーブル名:
hotel
フィールド名:
hotel_id
category(東京都・大阪府・・・)

テーブル名:
person
フィールド名:
person_id
hotel_id
price

テーブルhotelは常に変わりません。
人がホテルに泊まったら、テーブルpersonが増えていきます。複数店舗あるホテルが使うようなイメージです。2つのテーブルはhotel_idで繋がっている感じです。

---実行したい事---
東京都のホテルを利用した人のデータを取得したいです。
自分が持っている知識で「東京都のホテルがひとつの場合」は自分で書けます。

$re = mysql_query(SELECT * FROM hotel WHERE category = '東京都');

$ro = mysql_fetch_assoc($re);
$hotel_id = $ro['hotel_id'];

$re2 = mysql_query(SELECT * FROM person WHERE hotel_id = $hotel_id);

*細かい所は間違っているかもしれませんが、こんな感じだと思います。

ただ東京都のホテルは複数あるので、困ってます。
配列を使うのかな?などと漠然と思ってますが、上手いやり方はないでしょうか。

みなさんよろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/03/16 01:02:52
  • 終了:2007/03/17 06:34:23

ベストアンサー

id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/16 02:59:55

ポイント45pt

MySQLの質問をする場合は、バージョンを書いてください。4.0、4.1、5.0でサポート機能に大きな違いがあります。

質問中にある二つのSQLは、一つのSQLにすることが可能です。

最初の検索結果をアプリケーション中で配列に溜め込まなくても、サブクエリやジョインを使えば、一つのSQLで操作できます。

select ps.*
 from person as ps
 inner join 
 (select distinct person_id
   from hotel as h
   left join person as p
   on h.hotel_id=p.hotel_id
   where h.category='東京都') as x
 on ps.person_id=x.person_id;

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

その他の回答(3件)

id:Sampo No.1

Sampo回答回数556ベストアンサー獲得回数1042007/03/16 01:20:13

ポイント20pt
select 
  distinct person_id
from
  person
    left join
  hotel
    on person.hotel_id=hotel.hotel_id
where
  category = "東京都"

でできます。

id:thrillseeker No.2

thrillseeker回答回数328ベストアンサー獲得回数372007/03/16 01:25:31

ポイント11pt

定番のやり方としては、while文の中で mysql_fetch_array を繰り返しながら

該当するのホテルごとに処理を繰り返します。

$re1 = mysql_query("SELECT * from hotel WHERE category = '東京都'");

$rows = mysql_num_rows($re1);

if ($rows == 0)

{

    print "該当なし";

}

else

{

    while ($row = mysql_fetch_array($re1))

     {

        $re2 = mysql_query("SELECT * FROM person WHERE hotel_id = $re1['hotel_id']");

        print "$re1['hotel_id'],$re2['person_id'],$re2['price']<br>";

    }

}

id:tokyosmash

うーんたしかにこれでも一時的に出力するだけならできますよね。

ただ、$re2 = mysql_query("SELECT * FROM person WHERE hotel_id = 1 and 3 and 4 and 5");

みたいな状態に持っていきたいんですよね。その後で色々とやりやすいように。(hotel_id = 1 and 3 and 4 and 5 の書き方が正しいかどうかは別として)

該当するhotel_idを配列に格納して再SQL・・というイメージなのですが、何か方法は無いでしょうか??

2007/03/16 02:18:01
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/16 02:59:55ここでベストアンサー

ポイント45pt

MySQLの質問をする場合は、バージョンを書いてください。4.0、4.1、5.0でサポート機能に大きな違いがあります。

質問中にある二つのSQLは、一つのSQLにすることが可能です。

最初の検索結果をアプリケーション中で配列に溜め込まなくても、サブクエリやジョインを使えば、一つのSQLで操作できます。

select ps.*
 from person as ps
 inner join 
 (select distinct person_id
   from hotel as h
   left join person as p
   on h.hotel_id=p.hotel_id
   where h.category='東京都') as x
 on ps.person_id=x.person_id;

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

id:chuken_kenkou No.4

chuken_kenkou回答回数722ベストアンサー獲得回数542007/03/16 03:24:10

ポイント41pt

冗長になっていたので、訂正版です。

select p.*
 from person as p
 inner join hotel as h
 on p.hotel_id=h.hotel_id
 where category='東京都';

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.2.11 初期の MySQL バージョンに合わせたサブクエリの書き換え

MySQLは、「サブクエリではインデクスが有効利用されない場合がある」ので、性能を重視する場合は、ジョインで代用してください。

id:tokyosmash

できました!

ようやく完璧にできました。

どのような仕組みで上手く出来ているのか理解するのには時間がかかりそうですが、サブクエリとジョインを勉強してみようと思います。

具体的に書いて頂いてありがとうございました!

2007/03/16 04:08:05

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

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

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

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

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