- ベストアンサー
PDOを使ったSQL文の入力方法
- PDOを使ってSQL文を実行する方法について教えてください。
- 特定の地域や条件で絞り込んだ結果を表示させたいです。
- bukkenとkodawariというテーブルを使用して、kidの条件による絞り込みを行いたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>今回はとにかく2テーブルで作ってみたいです。 了解。ただし今後いろいろ機能追加しようとすると、どんどん辛くなってきますよ。覚悟。 HAVING COUNT(*) = N の部分は、「kidの個数」が入ればよいので、 count($_POST['kid']) で取得できます。 その他どんな関数があるのか目を通しておくとよいです。 http://jp2.php.net/manual/ja/ref.array.php kidが1個しかない場合でも動きますが、本来は WHERE kid = X だけにして、 fid毎にまとめるGROUP BY ~や、集計するHAVING COUNT~は不要です。 余力があれば1個の時を分岐させてみて下さい。
その他の回答 (2)
- JaneDue
- ベストアンサー率75% (263/350)
kid 1,2,3 すべてを持つ 物件id を取得したい、という事であれば。 SELECT * FROM bukken WHERE id IN( SELECT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3) -- kidが1か2か3 GROUP BY fid -- fid毎にまとめて HAVING COUNT(*)=3 -- その合計が3個のもの ) でいけるかと。 ご質問の主旨とは異なりますが、テーブルの切り方がまずくありませんか?。こだわり条件って確か「南向き」とか「新築」とかでしたよね。だとすれば別テーブルにしない方がよいのではないでしょうか。 例として(混乱すると困るので参考程度に軽く読んで下さい) 例えば「 1 物件につき画像 1枚 」の場合は、物件テーブルに直接 カラム image を作れば良いですよね。 一方「画像は何枚でもOK」としたい場合は、データがいくつになるか不明なので、画像用テーブルを別に作成すべき、ということになります。 考え方としては「物件が決まれば一意的に決まる内容」は直接物件テーブルにまとめ、データ数不明の場合は別テーブルにします。 別例として[売主id]でしたら 1物件につき1人なので物件テーブルに、[下見した顧客id]なら件数不明になるので別テーブルにします。 同じく[物件紹介文]なら物件テーブルに、[見た人の感想文]なら別テーブルへ。 [最寄駅]なら物件テーブルに、[近い駅]なら別テーブルへ…という感じです。 さて、当該のこだわり条件についてですが、一見いくつ該当するか不明なので別テーブルがふさわしいようにも思えますが、実際には「南向き」かどうか、「新築」かどうか等の各条件は其々まったく別の性格のもので、「物件がきまれば自動的に決まるその物件の属性」と観ることができます。 また、データ数も不明ではありません。(全条件の数以上に条件がある、ということはあり得ませんよね) くどくなりましたが、こだわり条件は直接物件テーブルに入れる方がよいのではないかと。(今の状態でも出来ないことはありませんが、正規化がうまくいっていない為クエリは複雑になり処理も遅くなってしまいます) ご参考まで。
お礼
すみません書き忘れてしまったのですが、1つのテーブルで作る意見もいただき本当にありがとうございます! 試したいのですが、現在の2テーブルパターンを途中までかれこれ2、3ヶ月も悩んで途中まで作ってしまっているので(笑)、後には引けない状態になっております。 余裕ができたら1テーブルも試したいと思っているので今回はとにかく2テーブルで作ってみたいです。 わがまま言って申し訳ないです。 あと補足の補足なのですが、文章を書き忘れていた部分がありました。 読み辛くて申し訳ありません。 ここで一つ疑問なのですが、HAVING COUNT(*) = 3以外のチェックが付いたとき(例えば1,4とか1,2などはHAVING COUNT(*) = 2で チェックが付いたのが1つとかだったらHAVING COUNT(*) = 1ですよね? HAVING COUNT(*) = N のNの部分はチェックボックスにチェックした数に対応して自動に変化させることってできないでしょうか? もしくは全然べつの方法でも良いですが 今のままだとHAVING COUNT(*) = 3じゃないと対応できないですよね? ユーザーによってはチェックをいくつつけるのかわからないのでそれに対応するコードを作ってみたいです。 もちろん私が設定した条件でのコードを教えてもらったのでできないのは私のせきにんなのですが。 もしよろしければ そんなときの対応のためのSQL文はどのようなものかご教授いただけないでしょうか? 気が向きましたらまたよろしくお願い致します。
補足
アドバイスいただき本当にありがとうございます! 私の理解力が無いのがかなり申し訳ないですがどうかご容赦いただきますようよろしくお願い致します。 下記のようなフォームに1,2,3にチェックがついたとしたら フォームからチェックボックスに受けたとして、 <th>こだわり条件</th> <td> <input type="checkbox" name="kid[]" value="1" <?php if (isset($_REQUEST['kid']) and in_array('1',$_REQUEST['kid'])) print 'checked'; ?>/> 新築 <input type="checkbox" name="kid[]" value="2" <?php if (isset($_REQUEST['kid']) and in_array('2',$_REQUEST['kid'])) print 'checked'; ?>/> 南向き <input type="checkbox" name="kid[]" value="3" <?php if (isset($_REQUEST['kid']) and in_array('3',$_REQUEST['kid'])) print 'checked'; ?>/> セキュリティ充実 <input type="checkbox" name="kid[]" value="4" <?php if (isset($_REQUEST['kid']) and in_array('4',$_REQUEST['kid'])) print 'checked'; ?>/> 市街地が近い<br /> <input type="checkbox" name="kid[]" value="5" <?php if (isset($_REQUEST['kid']) and in_array('5',$_REQUEST['kid'])) print 'checked'; ?>/> 内装リフォーム <input type="checkbox" name="kid[]" value="6" <?php if (isset($_REQUEST['kid']) and in_array('6',$_REQUEST['kid'])) print 'checked'; ?>/> システムキッチン <input type="checkbox" name="kid[]" value="7" <?php if (isset($_REQUEST['kid']) and in_array('7',$_REQUEST['kid'])) print 'checked'; ?>/> ペット可</td> </tr> </table> 次に値を受けるPHPの式はアドバイスのSQLを実行するために下記のように入力しました。 if(isset($_POST['kid'])and is_array($_POST['kid'])){ $ary = array_filter($_POST['kid'], function($v) {return is_numeric($v);}); $sqlK1 = 'id IN(SELECT fid FROM fudou_kodawari2 WHERE kid IN ('.implode(',', $ary).') GROUP BY fid HAVING COUNT(*) = 3'; こうするとPDOでMySQLに下記のようなSQL文が実行されます。 SELECT * FROM bukken WHERE id IN(SELECT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3) GROUP BY fid HAVING COUNT(*) = 3) そうすることによって id ,bukken_name ,chiiki_id ,address price_min price_max station 1 名駅MID 1 愛知県名古屋市中村区 40770000 55100000 名古屋駅 のような結果が出てきました。 ここで一つ疑問なのですが、HAVING COUNT(*) = 3以外のチェックが付いたとき(例えば1,4とか1,2などはHAVING COUNT(*) = 2で チェックが付いたのが1つとかだったらHAVING COUNT(*) = 1ですよね? もちろん私が設定した条件でのコードを教えてもらったのでできないのは私のせきにんなのですが。 もしよろしかったのであれば そんなときの対応のためのSQL文はどのようなものかご教授いただけないでしょうか?
- bin-chan
- ベストアンサー率33% (1403/4213)
正しいSQL文の組立てと、PDOへの組み込みは分けて考えて。 > なので 1,2,3,4,7,8 という結果が表示されますが 、1,2,3の全てに一致する条件 fidなのか、kidなのか、ごちゃごちゃになりませんか? > SELECT DISTINCT * FROM bukken WHERE (id IN (SELECT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3))) SELECT * FROM bukken WHERE (id IN (SELECT DISTINCT fid FROM fudou_kodawari2 WHERE kid IN (1,2,3))) じゃないですか?
補足
アドバイスいただき誠に感謝いたします。 ありがとうございます! DISTINCTは無くしたほうが良いのですね。
お礼
JaneDue様、いつもアドバイスいただき、ありがとうございます! おかげさまでHAVING COUNT(*) = count($_POST['kid'])が実行でき、条件を絞ることが出来ました! コードの文法を間違えるとsyntax errorなどが出てくるので私にとってかなり難しかったですが、何とか上手く実行することができました。 本当にありがとうございます! >余力があれば1個の時を分岐させてみて下さい。 ちょっと時間がかかるかもしれませんが、こちらも頑張ってみたいと思います! あとは画像も表示させたいです。頑張ってみようと思います。 本当にデータベースと接続して検索できるホームページの制作の難しさ は想像以上です。 また機会があればよろしくお願い致します!