よくある不動産物件検索サイトで、建物が同じ場合には、その1つの建物の中に家賃や階数などの部屋情報をまとめて表示するための方法が分からなくて困っています。DBはMYSQLを使っており、テーブルには、ID番号や建物名、家賃や専有面積など、既にたくさんのデータが入っています。
やりたい事は、例えばPHPのwhile文やforeach文などでのループの中で、建物名が同じであれば、建物の表示に関しては1度だけに限り出力し、あとは家賃や階数などの部屋情報に限ってまとめて出力したいです。SQL文やPHPで、どのような工夫をすべきでしょうか?
このような構造をイメージしています。
while(){
<?php 建物情報を出力 ?>
while(){
<?php 部屋Aの情報を出力 ?>
<?php 部屋Bの情報を出力 ?>
<?php 部屋Cの情報を出力 ?>
}
}
建物情報のテーブルと、部屋情報のテーブルに分けてDBを管理するとして、DBからどのようなSQL文を発行し、PHPではどのような処理をすればよいのか。。
現在運営している不動産物件サイトの表示の仕方を上記のようにしたいのですが、何かヒントになるような助言が頂ければ幸いです。よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
正規化の例
仮に物件テーブルが元々こうだとします。
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
このように集計単位をあらかじめ想定して、データの持たせ方を設計していきます。
たとえば都道府県→市区町村→町とドリルダウンさせるのであれば、
それぞれをテーブルに分割して処理する必要があります。
詳細に説明いただきありがとうございます。示して頂いたデータを実際に入力し、phpmyadminで表示を確認しました。同じ建物の部屋数がcountされていますね。ここから、例えばcountが2以上であれば、続けて部屋情報を出力するとか工夫できそうです。(現在のポインタと同じ建物IDをキーに、部屋情報を抽出する・・・?)
それ以前に、どんなデータを取得したいかを良く考えてDB設計すべきなのですね。大変勉強になりました。
No.3
- 回答日時:
正規化するのであれば、物件データから建物情報を分離して建物IDで管理すればよいでしょう
MySQLを初めて使ってからまだ1週間くらいなので、あまり良く分かってないのですが、正規化とはテーブルを適切に分割するような意味合いでしょうか。いま1つのテーブルに全ての情報が入っている状態なのですが、2つに分けてそれらを紐づけて(?)データ抽出などした方が扱いやすいのではないかと思いました。
建物IDで管理する場合は、2つのテーブルに共通のカラム(建物ID)を持たせて、JOIN句などで結合などすればよいでしょうか?
No.2
- 回答日時:
>>建物情報のテーブルと、部屋情報のテーブルに分けてDBを管理するとして、DBからどのようなSQL文を発行し、PHPではどのような処理をすればよいのか。
。DB内の建物情報のデータと部屋情報のテーブルにあるデータを紐づけるキーが必要です。
建物情報は、建物を示すキーをつけます。これを「主キー」あるいは「プライマリーキー」といいます。
部屋情報もそれ自身を識別する「主キー」をつけますけど、さらに、建物情報のデータを指し示すキーを追加します。これを「外部キー」といいます。
それさえあれば、1つの建物ごとに、その建物にぶら下がっている部屋情報をキーで抽出し、部屋番号順に並べて出力すればいいだけです。
もし、そういう紐付けのキーデータが入力されていないなら、そのデータを入れる項目を追加して、データを投入する作業をすることになります。
いま1つのテーブルに建物情報や建物ID、部屋情報など全ての情報が入っている状態なのですが、2つのテーブルに分け、共通のカラム(建物ID)を持たせて、建物IDをキーに抽出した場合、1つの建物ごとにSQL文を実行することになりますか?そうすると、何百も何千も、建物の数だけSQL文を実行することになる感じでしょうか。
No.1
- 回答日時:
Webアプリを作成する際、こと画面に関してはプログラムの処理アルゴリズムを考える前に画面のHTMLがどのようになるかをイメージしましょう。
また、HTMLは画面の上から下へ順に送出しなければなりません。
つまり一覧表形式の画面を動的に生成する場合、1件目の表示項目に中にあるデータを全て揃えてから1件目のHTMLの送出をせねばなりません。もしくは、(少なくとも)1画面分に入る全件数分のデータを配列構造のデータに揃えてから送出処理に掛かるかです。
ちなみに1件分のデータを得て送出、2件目のデータを得て送出とした方がWebブラウザ側では届いたデータから順次表示をして行けますので、画面の前に居る利用者は自身が操作した動作要求に対して処理結果が返って来ていることがわかりますが、全部揃えてから送出に掛かる場合は何も動作しない待ち時間がやや長めになる可能性があります。微々たるものと言えば微々たるものですが、サーバの能力にあまり余裕が無い場合や、回線が込み合っている場合は利用者側の感じ方に差が出る場合があります。そういったことも頭の片隅に置いて設計されるとよいでしょう。
なお、いきなりプログラム言語で書くのではなく、日本語(正確には母国語)でデータ設計と処理手順の設計を行ってからプログラム言語への“翻訳”を行われるとよいでしょう。
ご質問にあることは設計(プログラム設計)であってコーディングで考える事では無いです。
参考まで。
参考になります。確かに、あらかじめ全てのデータを処理するより、ユーザーごとに必要なデータの分だけ抽出してあげれば、全体として合理的ですね。そうすると、ループの中で次のデータを抽出するようにした方が、無駄なく処理できそうですね。そのようなことにも気を配りながら、制作したいと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
MySQLのテーブル選択について
-
PHP+MYSQLでレコードをランダ...
-
ヒアドキュメントでSQLを書く事...
-
MySQLの日付データとPHPの日付...
-
Accessへ日付をINSERT
-
OracleからAccessへのインポート
-
PHP MYSQLを利用した掲示板の...
-
会員サイトでログイン後の会員...
-
実行時エラー3131 FROM 句の構...
-
データベースに存在するデータ...
-
時刻型にNULLでセットしたい
-
VBAをつかってクエリの情報を抽...
-
PHPでの検索機能がうまく動きま...
-
ResultSetインターフェイスでの...
-
mysqliを使ってデータベースを...
-
PHP+MYSQL IF文の初歩
-
Resource id #3 をフィールドの...
-
dbに登録したデータをphpのプル...
-
PHPのプルダウンメニューにDBの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
DB Error: no such field
-
csvをDBへ読み込んだら、NULLが...
-
php sqlite count 列数取得
-
日またぎの計算
-
PHPとMySQLで掲示板を作っています
-
MDB2エラーが対応出来ません。
-
Int型のフィールドへのNULLを入...
-
MySqlのテーブルのサイズを取得...
-
変数にNULLを代入したい
-
エクセルをMysqlに格納
-
PHPでmySQLのテーブルを作成したい
-
MySQLの一部を、計算した後に表...
-
SQLで返り値が空とでる
-
重複データをカウントするのに...
-
SQL CASE 文について
-
どちらが高速ですか?
-
Accessへ日付をINSERT
-
SQLのUPDATE文につい...
-
phpにて出欠登録管理を作成して...
おすすめ情報