• ベストアンサー

複数条件検索について

よろしくお願いします。 検索条件として以下3つあるとします。 1.人数指定 2.年齢指定 3.住所指定 普通ですとこの条件全てを満たしたデータを検索するように ANDなどでしますが、この3つの条件がランダムな場合(例えば 1と2、1と3などなど・・)、ANDですと全て揃ってないと 検索結果が得られません。ORですとどちらかに合った検索結果になってしまいます。 ランダムな組み合わせでその条件を全て満たした結果を得るには何か うまい方法はありますでしょうか?? 説明が下手で申し訳ありませんが、よろしくお願いします。 環境 OS:winXP PHP4.4.4 apache2 mysql4

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

$a4がカラ、$a5がカラ、もしくはカラム4が$a4と$a5の間ということですから こんな風じゃないですか? where 1 AND (カラム1='{$a1}' OR '{$a1}'='') AND (カラム2='{$a2}' OR '{$a2}'='') AND (カラム3='{$a3}' OR '{$a3}'='') AND ((カラム4 BETWEEN '{$a4}' AND '{$a5}') OR '{$a4}'='' OR '{$a5}'='' ) BETWEENの場合$a4<=$a5がなりたっていないとマッチしませんので、 $a4>$a5のチェックをいれたりする必要があるかも

hajimete-san
質問者

お礼

yambejpさん、返事が遅れました。 何度もありがとうございました。 無事解決出来ました、感謝です。 今後もまたよろしくお願いします。 本当にありがとうございました。

その他の回答 (4)

回答No.4

ちょっと方向違い&DB違いですが... 条件が5つの内3つ以上当てはまるものを 検索って仕事をやったことがあります SQLServerなので参考程度・・ SELECT * FROM t_顧客 WHERE ( CASE WHEN t_顧客.家族人数 >= 4  THEN 1 ELSE 0 END + CASE WHEN t_顧客.年齢 >= 20 THEN 1 ELSE 0 END + CASE WHEN t_顧客.住所県 = '東京都' THEN 1 ELSE 0 END + CASE WHEN t_顧客.性別 = '男' THEN 1 ELSE 0 END + CASE WHEN t_顧客.年収 >= 400 THEN 1 ELSE 0 END ) >= 3

hajimete-san
質問者

お礼

nakanisi80さん、書き込みありがとうございました。 参考程度でも、ありがたいです。 ありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

う~ん、それってPHPでWHERE句を動的に書き換えてやればいいんじゃないですか? 一応、その手のことを昔考えたことがあるので、参考までに select * from DB名 where 1 AND (カラム1='{$a1}' OR '{$a1}'='') AND (カラム2='{$a2}' OR '{$a2}'='') AND (カラム3='{$a3}' OR '{$a3}'='')

hajimete-san
質問者

補足

yambejpさん、再度書き込みありがとうございます。 上記の方法でうまく行きました。 ありがとうございます。 そこで再度質問なのですが、この条件に範囲指定があった場合、上記の方法を素にすると select * from DB名 where 1 AND (カラム1='{$a1}' OR '{$a1}'='') AND (カラム2='{$a2}' OR '{$a2}'='') AND (カラム3='{$a3}' OR '{$a3}'='') AND (カラム4 BETWEEN (カラム4='{$a4}' OR '{$a4}'='') AND (カラム4='{$a5}' OR '{$a5}'='') ) のような感じになるでしょうか? 試しにやってみましたが、うまく結果が得られませんでした。 因みにAND (カラム4 BETWEEN ('{$a4}' OR '{$a4}'='') AND ('{$a5}' OR '{$a5}'='') )も試してみました。 こういう場合、範囲指定は難しいものでしょうか? 無理なら、範囲指定はやめようと思っています。 でも本当に助かりました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

(人数指定が無い OR (人数指定が有る AND 人数=指定値)) AND (年齢指定が無い OR (年齢指定が有る AND 年齢=指定値)) AND (住所指定が無い OR (住所指定が有る AND 住所=指定値))

hajimete-san
質問者

補足

nda23さん、書き込みありがとうございます。 No1さんの書き込み同様、説明が足らず、申し訳ありません。 補足の内容を加味した場合、書き込んでいただいた内容は where以下に記述すればよいのでしょうか? >人数指定が無い ここは例えば、$a1=NULLという考えでよいのでしょうか? それと同様に >人数指定が有る は$a1!=NULLというこで良いのでしょうか?その続きのANDは 人数指定があった場合、ANDが走るという感じでよいのでしょうか? よく理解できてなくよみません。自分でも確認してやってみます。 もっとよい方法があれば、またご教示ください。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

1and2 or 1and3 でよいのでは?

hajimete-san
質問者

補足

yambejpさん、早速の書き込みありがとうございます。 こちらの説明不足ですみません。 ($a1=検索条件の1の値として・・以下割愛) "select * from DB名 where カラム名=$a1 AND カラム名=$a2 AND カラム名=$a3" というselect文を用意し、このwhere以下が検索条件の値が空値の場合、検索条件から外れて他の条件で結果を得られるようにしたいのです。 例えば$a1=nullだったら、何かの方法で "select * from DB名 where カラム名=$a2 AND カラム名=$a3" とカラム名=$a1が無くなって、他の2つの条件で結果がほしいのです。 ORですとどちらかの条件を満たすものになるので、それではなくANDで得たいのです。 よく不動産検索のシステムで条件を色々こちらで決めて検索結果が得られような感じでしょうか?? 説明が足りず本当にすみませんでした。 こちらも再度色々調べてみます。また上記の内容でお分かりになりましたら、またご教示お願いいたします。

関連するQ&A