お世話になります。PHPでMySQLを使ったウェブサービスを作っているのですが、以下のような正規化を行った構成のデータは、どのようなSQL文となるのかイメージ出来ずに質問いたします。
memberテーブル
no name old sex
1 田島 21 woman
2 佐藤 32 man
3 菊池 26 woman
kudamonoテーブル
no name
1 いちご
2 みかん
3 バナナ
4 りんご
5 ぶどう
likeテーブル(メンバーが好きな果物を登録。memberテーブルのnoとmember_no、kudamonoテーブルのnoとkudamono_noは紐づいている)
no member_no kudamono_no
1 1 1
2 1 3
3 2 2
4 3 1
5 3 4
6 3 5
このテーブル構成にて、田島のデータは21歳の女性、好きな果物はイチゴとバナナです。
このような構成のテーブルで、年齢の範囲や性別、好きな果物をチェックボックスやセレクトボックスで選択し、該当するメンバーを呼び出したいと考えています。
ここで質問です。対象となる基本のテーブルがmemberテーブルかとは思うのですが、好きな果物はメンバー1人に対して複数あるので、負担なく検索するにはどのようなSQLとなるのかがイメージ出来ません。
以前、この果物は、memberテーブル内にカラムを設け、「ばなな,いちご,ぶどう」といった形で保存していたのですが、正規化した方が良いとのアドバイスをいただき今回のような構成にしたものの、今度は呼出す際の負担のないSQLに困っている次第です。
お忙しい中恐縮ですが、ご指南のほどよろしくお願いいたします。
■■ 追加情報 ■■
実際のテーブル構成は以下の通りです。
質問ではイメージしやすいようにと個人が好きな果物を例えにしていますが、実際は不動産物件情報で、それに付随する、「駅チカ物件」「ペット可」「デザイナーズ物件」などです。
ですので、
memberテーブル ⇒ property_dataテーブルであり(※)
kudamonoテーブル ⇒ osusumeテーブルであり
likeテーブル ⇒ property_data_osusumeであります。
※不動産物件という事ありカラムが多数あるので多くを省略しています。
これら構成の元、方位が西、または南西向きで、3LDK、ペット可で駅チカ物件と検索した際、該当する物件を抽出したいと考えたとき、例の果物に当たるosusumeが、チェックボックスでn個を検索条件とした場合、どのようなSQLになるのか?悩んでいるところです。
CREATE TABLE `property_data` ( `data_no` int(11) NOT NULL, `data_corporate_user_no` int(11) NOT NULL, `data_cate_b_no` int(11) NOT NULL, `data_cate_m_no` int(11) NOT NULL, `data_pr` varchar(255) NOT NULL, `data_bukkenn_name` varchar(255) NOT NULL, `data_train1` varchar(64) NOT NULL, `data_train_station1` varchar(64) NOT NULL, `data_train_station_toho1` int(11) NOT NULL, `data_addr1` varchar(128) NOT NULL, `data_addr2` varchar(128) NOT NULL, `data_addr3` varchar(255) NOT NULL, `data_houi` enum('','北','北東','東','南東','南','南西','西','北西') NOT NULL, `data_madori1` varchar(16) NOT NULL, `data_madori2` enum('ワンルーム','K','DK','LK','LDK','SK','SDK','SLK','SLDK') NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- テーブルのデータのダンプ `property_data` -- INSERT INTO `property_data` (`data_no`, `data_corporate_user_no`, `data_cate_b_no`, `data_cate_m_no`, `data_pr`, `data_bukkenn_name`, `data_train1`, `data_train_station1`, `data_train_station_toho1`, `data_addr1`, `data_addr2`, `data_addr3`, `data_houi`, `data_madori1`, `data_madori2`) VALUES (20, 12, 1, 1, '駅近、ファミリータイプ物件!通り沿いで交通に便利なの物件です。', 'サニーレジデンス301', 'JR上越線', '長岡', 15, '新潟県', '長岡市', '旭町2丁目3-31', '東', '3', 'DK'), (21, 12, 1, 1, '駅近、ファミリータイプ物件!通り沿いで交通に便利なの物件です。', 'サニーレジデンス402', 'JR上越線', '長岡', 15, '新潟県', '長岡市', '旭町2丁目3-25', '南西', '3', 'DK'), (22, 13, 2, 10, 'ファミリー向けです!', 'エヌステージ似弐号館', 'JR弥彦線', '北三条', 2, '新潟県', '三条市', '本町1-3', '東', '4', 'LDK'), (23, 13, 2, 10, 'ファミリー向けの物件です!', 'エヌステージ壱号館', 'JR弥彦線', '北三条', 10, '新潟県', '三条市', '本町1-3-17', '南東', '4', 'LDK'), (24, 14, 1, 4, 'アスファルト、街灯、屋根付きのセキュリティーの高い駐車場', 'アテンド駐車場', 'JR上越線', '長岡', 20, '新潟県', '長岡市', '土合5丁目10-17', '北', '3', 'DK'), (25, 12, 1, 1, 'エントランスが貴方の行き帰りをおもてなしします', 'Nステージ', 'JR信越本線(直江津~新潟)', '亀田', 40, '新潟県', '新潟市江南区', '二本木4丁目5-37', '南', '2', 'K'), (26, 12, 2, 12, '広々した憧れの一軒家 二世帯でも対応可能な広さです', '三和区錦 一軒家', '北越急行ほくほく線', '大池いこいの森', 50, '新潟県', '上越市', '三和区錦1180-4', '南東', '5', 'LDK'), (27, 14, 1, 1, '加治川のせせらぎ日頃の疲れを癒してくれます', 'ライフル', 'JR羽越本線', '新発田', 5, '新潟県', '新発田市', '豊町2丁目9-1', '北東', '3', 'DK'), (29, 12, 2, 12, '広々した憧れの一軒家 二世帯でも対応可能な広さです', '三和区錦 一軒家', '北越急行ほくほく線', '大池いこいの森', 25, '新潟県', '上越市', '三和区錦1180-1', '南', '5', 'LDK'), (30, 13, 2, 17, '想定利回り10%強! 現況満室の高収益物件!', 'エヌステージ似弐号館', 'JR上越線', '越後堀之内', 2, '新潟県', '三条市', '本町1-3', '南', '4', 'LDK');
CREATE TABLE `osusume` ( `osusume_no` int(11) NOT NULL, `osusume_name` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- テーブルのデータのダンプ `osusume` -- INSERT INTO `osusume` (`osusume_no`, `osusume_name`) VALUES (19, 'お風呂広い'), (7, 'シニア(60歳以上)入居可'), (22, 'デザイナーズ物件'), (13, 'ファミリー向け'), (17, 'フリーレント'), (9, 'ペット可'), (12, 'ルームシェア可'), (21, 'ロープライス・フローライフ'), (11, '事務所利用可'), (6, '二人入居可'), (14, '保証人不要'), (1, '女性限定'), (8, '子供可'), (4, '学生可'), (18, '更新料不要'), (10, '楽器可'), (3, '法人可'), (2, '男性限定'), (20, '訳アリ物件'), (23, '駅チカ物件');
CREATE TABLE `property_data_osusume` ( `property_data_no_osusume` int(11) NOT NULL, `property_data_data_no_osusume` int(11) NOT NULL, `property_data_osusume_no` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- テーブルのデータのダンプ `property_data_osusume` -- INSERT INTO `property_data_osusume` (`property_data_no_osusume`, `property_data_data_no_osusume`, `property_data_osusume_no`) VALUES (1, 1, 1), (2, 1, 7), (3, 1, 12), (4, 2, 22), (5, 2, 3), (6, 2, 8), (7, 3, 12), (8, 3, 18), (9, 4, 22);
回答3件
あなたの回答
tips
プレビュー