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

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);

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

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

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

●質問者: tokyosmash
●カテゴリ:インターネット ウェブ制作
✍キーワード:MySQL PHP RO SELECT いるか
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

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

でできます。


2 ● thrillseeker
●11ポイント

定番のやり方としては、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>";

    }

}

◎質問者からの返答

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

ただ、$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・・というイメージなのですが、何か方法は無いでしょうか??


3 ● chuken_kenkou
●45ポイント ベストアンサー

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


4 ● chuken_kenkou
●41ポイント

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

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

◎質問者からの返答

できました!

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

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

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

関連質問


●質問をもっと探す●



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