Yahoo!のようなキーワード検索フォームから検索を行った場合に、
下記カラムの「名前」~「備考」までを検索範囲としたいと思っています。
▼カラム
名前 name
住所 area
特徴 toku
備考 nanka
血液 type
PR prpoint
この場合どのようなソースの書き方になるのでしょうか?
下記のようなものをいろいろ試したのですが、結果上手く行きません。。。
WHEREの後の書き方だったりするんでしょうか?
$key = htmlspecialchars($_POST["submit"], ENT_QUOTES);
$where = " WHERE ****** Like '%$key%'";
$csql = "SELECT name,area,toku,nanka FROM humantable $where;";
単純に、こんな書き方じゃなくてもこんなのもアル!というのもお待ちしています。
あとこの辺の事が詳しい書籍なんかありましたら教えて
つかあさい。
どうかご教授宜しくお願いします。
$where = "Where name like '%$key%' or area like '%$key%' or toku like '%$key%' or nanka like '%$key%' or type like '%$key%' or prpoint like '%$key%'";
はずしてるかもわかりませんが・・。
そんな操作をやろうと思ったら、インデクスを使えず、母体件数に比例して性能劣化しますよ?
趣味の範囲ならいいですが、仕事がらみならやるべきではありません。
(1)方法1<文字連結する>・・・最悪のやりかた
where concat_ws(0x0000,name,area,toku,nanka) Like '%$key%'
(2)方法2<or 条件にする>・・・(1)よりはまだいいかも。
where name Like '%$key%' or area Like '%$key%' or toku Like '%$key%' or nanka Like '%$key%'
(3)方法3
MoSQLを利用
http://mosql.jp/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E...
ありがとうございます。
あくまで趣味です。とても仕事にはできません。。
なにか、ものすごく間違った事をやろうとしているのではないかと思ってきました。
単純に、データの中から検索の必要があるカラムを見て表示させたいだけなんです。
母体件数件数が相当に少ない(数百件~数千件くらい)なら、インデクスを使わなくても大きな問題は
ないでしょう。
しかし、数万、数十万といった母体から、データを抽出しようと思うと、インデクスを使えないと母体件数に
比例して性能劣化します。
インデクスを有効利用できる検索条件は、「=」条件や範囲条件、LIKEで前方一致(「列名 LIKE 'abc%'」)
などです。LIKEで%abc%'といった指定では、まったくインデクスが使われなかったり、インデクスの最下段を
すべて見るといったことになります。
今回の場合、もし前方一致にできるなら、文字連結でなく、OR条件にすればインデクスを使えると
思います。
ありがとうございます。
今は数百件すら想定にない状態ですが、数十万というデータも問題ないプログラムができるようになりたい今日この頃です。自分の頭の中では、キーワードの検索にはLIKE必須で、文中の文字を検索するのだから%$key%でないとダメなんじゃないかと生半可な知識で思ってしまいました。
取りあえず出力するだけなら LIKE でいいだろうけど、まともにやるなら、Senna 等の前文検索エンジンを使ったほうがいい。
一応標準機能だけで何とかする方法も無くは無い。
MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ
なるほど、ありがとうございます。
こういったものもあるんだなと勉強させていただきました。
ASPなどを除く、ほとんどの商業サイトでもキーワード検索(もちろんDBのデータを検索するもの)ができると思うんですが、全文検索エンジンを使用しているところが多いってことなのでしょうかね。。。
ありがとうございます。
エラーにはならないのですが、検索結果が出てこないようです。
実は試したものだったのですが、検索プログラムで普通このような書き方に
なるものなのか、ちょっと疑問だったりもしてます。