プロが教えるわが家の防犯対策術!

よくある不動産物件検索サイトで、建物が同じ場合には、その1つの建物の中に家賃や階数などの部屋情報をまとめて表示するための方法が分からなくて困っています。DBはMYSQLを使っており、テーブルには、ID番号や建物名、家賃や専有面積など、既にたくさんのデータが入っています。

やりたい事は、例えばPHPのwhile文やforeach文などでのループの中で、建物名が同じであれば、建物の表示に関しては1度だけに限り出力し、あとは家賃や階数などの部屋情報に限ってまとめて出力したいです。SQL文やPHPで、どのような工夫をすべきでしょうか?

このような構造をイメージしています。

while(){

<?php 建物情報を出力 ?>

while(){

  <?php 部屋Aの情報を出力 ?>
  <?php 部屋Bの情報を出力 ?>
  <?php 部屋Cの情報を出力 ?>

}

}

建物情報のテーブルと、部屋情報のテーブルに分けてDBを管理するとして、DBからどのようなSQL文を発行し、PHPではどのような処理をすればよいのか。。

現在運営している不動産物件サイトの表示の仕方を上記のようにしたいのですが、何かヒントになるような助言が頂ければ幸いです。よろしくお願いいたします。

A 回答 (4件)

Webアプリを作成する際、こと画面に関してはプログラムの処理アルゴリズムを考える前に画面のHTMLがどのようになるかをイメージしましょう。


 また、HTMLは画面の上から下へ順に送出しなければなりません。
 つまり一覧表形式の画面を動的に生成する場合、1件目の表示項目に中にあるデータを全て揃えてから1件目のHTMLの送出をせねばなりません。もしくは、(少なくとも)1画面分に入る全件数分のデータを配列構造のデータに揃えてから送出処理に掛かるかです。
 ちなみに1件分のデータを得て送出、2件目のデータを得て送出とした方がWebブラウザ側では届いたデータから順次表示をして行けますので、画面の前に居る利用者は自身が操作した動作要求に対して処理結果が返って来ていることがわかりますが、全部揃えてから送出に掛かる場合は何も動作しない待ち時間がやや長めになる可能性があります。微々たるものと言えば微々たるものですが、サーバの能力にあまり余裕が無い場合や、回線が込み合っている場合は利用者側の感じ方に差が出る場合があります。そういったことも頭の片隅に置いて設計されるとよいでしょう。

 なお、いきなりプログラム言語で書くのではなく、日本語(正確には母国語)でデータ設計と処理手順の設計を行ってからプログラム言語への“翻訳”を行われるとよいでしょう。
 ご質問にあることは設計(プログラム設計)であってコーディングで考える事では無いです。

参考まで。
    • good
    • 0
この回答へのお礼

参考になります。確かに、あらかじめ全てのデータを処理するより、ユーザーごとに必要なデータの分だけ抽出してあげれば、全体として合理的ですね。そうすると、ループの中で次のデータを抽出するようにした方が、無駄なく処理できそうですね。そのようなことにも気を配りながら、制作したいと思います。ありがとうございました。

お礼日時:2016/05/02 20:05

>>建物情報のテーブルと、部屋情報のテーブルに分けてDBを管理するとして、DBからどのようなSQL文を発行し、PHPではどのような処理をすればよいのか。



DB内の建物情報のデータと部屋情報のテーブルにあるデータを紐づけるキーが必要です。
建物情報は、建物を示すキーをつけます。これを「主キー」あるいは「プライマリーキー」といいます。

部屋情報もそれ自身を識別する「主キー」をつけますけど、さらに、建物情報のデータを指し示すキーを追加します。これを「外部キー」といいます。

それさえあれば、1つの建物ごとに、その建物にぶら下がっている部屋情報をキーで抽出し、部屋番号順に並べて出力すればいいだけです。

もし、そういう紐付けのキーデータが入力されていないなら、そのデータを入れる項目を追加して、データを投入する作業をすることになります。
    • good
    • 0
この回答へのお礼

いま1つのテーブルに建物情報や建物ID、部屋情報など全ての情報が入っている状態なのですが、2つのテーブルに分け、共通のカラム(建物ID)を持たせて、建物IDをキーに抽出した場合、1つの建物ごとにSQL文を実行することになりますか?そうすると、何百も何千も、建物の数だけSQL文を実行することになる感じでしょうか。

お礼日時:2016/05/02 20:12

正規化するのであれば、物件データから建物情報を分離して建物IDで管理すればよいでしょう

    • good
    • 0
この回答へのお礼

MySQLを初めて使ってからまだ1週間くらいなので、あまり良く分かってないのですが、正規化とはテーブルを適切に分割するような意味合いでしょうか。いま1つのテーブルに全ての情報が入っている状態なのですが、2つに分けてそれらを紐づけて(?)データ抽出などした方が扱いやすいのではないかと思いました。

建物IDで管理する場合は、2つのテーブルに共通のカラム(建物ID)を持たせて、JOIN句などで結合などすればよいでしょうか?

お礼日時:2016/05/02 19:48

正規化の例



仮に物件テーブルが元々こうだとします。
create table bukken0(bid int not null unique,bname varchar(100) not null,address varchar(100) not null);
insert into bukken0 value(1,'東京都中央区中央町1-1','物件A'),
(2,'東京都中央区中央町1-2','物件B'),
(3,'東京都中央区中央町1-3 ××マンション201号','物件C-1'),
(4,'東京都中央区中央町1-3 ××マンション403号','物件C-2'),
(5,'東京都中央区東町1-1 ○○マンション103号','物件D-1'),
(6,'東京都中央区東町1-1 ○○マンション202号','物件D-2'),
(7,'東京都中央区東町1-1 ○○マンション303号','物件D-3'),
(8,'東京都千代田区千代田町3-1','物件E'),
(9,'東京都千代田区神田町4-1','物件F');

上記例ですと、物件3と4,5と6と7はそれぞれ同じ住所(マンション)です
住所データを外に逃がし、物件データと住所データに分けます
create table address(aid int not null unique,avalue varchar(100) not null);
insert into address value(1001,'東京都中央区中央町1-1'),
(1002,'東京都中央区中央町1-2'),
(1003,'東京都中央区中央町1-3 ××マンション'),
(1004,'東京都中央区東町1-1 ○○マンション'),
(1005,'東京都千代田区千代田町3-1'),
(1006,'東京都千代田区神田町4-1');

create table bukken1(bid int not null unique,aid int not null,ashosai varchar(100),bname varchar(100) not null);
insert into bukken1 value(1,1001,'','物件A'),
(2,1002,'','物件B'),
(3,1003,'201','物件C-1'),
(4,1003,'403','物件C-2'),
(5,1004,'103','物件D-1'),
(6,1004,'202','物件D-2'),
(7,1004,'303','物件D-3'),
(8,1005,'','物件E'),
(9,1006,'','物件F');

これを結合して表示すれば
select bid,avalue,ashosai,bname
from bukken1 as b
inner join address as a on a.aid=b.aid

住所ごとの物件数はこう
select a.aid,avalue,temp.count
from address as a
inner join (
select aid,count(*) as count
from bukken1
group by aid
) as temp on temp.aid=a.aid

このように集計単位をあらかじめ想定して、データの持たせ方を設計していきます。
たとえば都道府県→市区町村→町とドリルダウンさせるのであれば、
それぞれをテーブルに分割して処理する必要があります。
    • good
    • 0
この回答へのお礼

詳細に説明いただきありがとうございます。示して頂いたデータを実際に入力し、phpmyadminで表示を確認しました。同じ建物の部屋数がcountされていますね。ここから、例えばcountが2以上であれば、続けて部屋情報を出力するとか工夫できそうです。(現在のポインタと同じ建物IDをキーに、部屋情報を抽出する・・・?)

それ以前に、どんなデータを取得したいかを良く考えてDB設計すべきなのですね。大変勉強になりました。

お礼日時:2016/05/03 00:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!