1

ユーザーシステムの検索機能が希望どおりに検索されないことがわかったとき、検索機能を終了したところです。

'fname'と'lname'という2つの列を持つ日付ベーステーブルがある場合。

1つの行で、「fname」の値は「Ashley」で、「lname」の値は「Staggs」です。

「Ashley」または「Staggs」のいずれかを検索すると、結果は正しく取得されますが、「Ashley Staggs」を検索すると、結果が表示されません。

これを適切に行うにはどうすればよいですか?

私のSELECTクエリは次のとおりです。

SELECT * FROM `users` WHERE fname LIKE '%" . protect($_GET['s']) . "%' OR lname LIKE '%" . protect($_GET['s']) . "%'

このようなことが起こることはわかっていましたが、今回は理解できません。

ありがとう、アシュリー

4

6 に答える 6

3

'Ashley Staggs'はfnameにもlnameにも含まれていないため、リクエストは何も返しません。MySQLフィールドを連結してみることができます。

SELECT * FROM `users` WHERE fname LIKE '%" . $_GET['s'] . "%' OR lname LIKE '%" . $_GET['s'] . "%' OR CONCAT(fname, ' ', lname) LIKE '%" . $_GET['s'] . "%'

[編集]さらに良い:

SELECT * FROM `users`
WHERE REPLACE(CONCAT(fname, lname, fname), ' ', '')
LIKE '%" . str_replace(' ', '', protect($_GET['s'])) . "%'
于 2012-04-16T21:42:14.793 に答える
0
SELECT fname_lname FROM ( SELECT CONCAT(fname, ' ', lname) fname_lname FROM users ) users
WHERE fname_lname LIKE '%" . $_GET['s'] . "%'
于 2012-04-16T21:48:04.647 に答える
0

次のようなことを試してみてください。検索文字列をスペースで分割し、各単語を検索します。

$search = explode(' ', $_GET['s']);
$query = 'SELECT * FROM `users` WHERE 0';
foreach ($search as $v)
{
  $v = mysql_real_escape_string($v);
  $query .= " OR (`fname` LIKE '%{$v}%' OR `lname` LIKE '%{$v}%')";
}
// echo $query;
于 2012-04-16T21:48:42.777 に答える
0

sp00mの回答に関しては、少し異なるアプローチがありますが、同じコンセプトに基づいています。

$search = preg_replace ( "/\s\s+/" , " " , $_GET['s']);

そして、このクエリを使用します。

"SELECT * FROM `users` WHERE CONCAT(fname, ' ', lname) LIKE '%" . $search . "%' OR CONCAT(lname, ' ', fname) LIKE '%" . $search . "%'"

編集

ちょうどあなたが使うことができる考えを持っていました。基本的に、テーブルに2つの追加フィールドを作成できます。fname_lnameそしてlname_fname、前述の正規表現を使用して不要なスペースを取り除きexplode()、単語数を確認するために使用します。単語が2つある場合は、これら2つの新しいフィールドを使用して、クエリで2つの条件のみを指定できます。単語が1つしかない場合でも、クエリには2つの条件があります。

于 2012-04-16T21:50:48.407 に答える
0

ねえ、私はより強力でより強力な検索を提案したいのですがMyISAM、これにはテーブルコードが必要です

$q="you search string";
$searchArray = explode(" ", $q);
$query="SELECT * FROM cmusers WHERE  MATCH (`firstname`, `lastname`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";
$result=mysql_query($query) or die("Error founded:".mysql_error()."there is problem existing we feels a very great sorry");
$finded=mysql_num_rows($result);

これの動作はhttp://www.funnenjoy.comで見ることができます

于 2013-11-19T14:04:33.457 に答える
0

やるだけ

SELECT * FROM users WHERE CONCAT(firstname, ' ', lastname) LIKE '%{$search}%'

于 2016-09-22T05:39:33.883 に答える