0

ユーザーに1つ以上の単語を入力してほしいフォームがあります。これらの単語は、MySQLデータベースの複数の列と一致する必要があります。

私はいくつかのコードを作成し始めましたが、行き詰まっています。

<?php
  $term = $_SESSION['session_searchstring']; //Let's say that session is John Doe
  $searchterm = explode(' ',$term);

  $searchFieldName = "name";
  $searchCondition = "$searchFieldName LIKE '%" . implode("%' OR $searchFieldName LIKE '%", $searchterm) . "%'";

  $sql = "SELECT * FROM students WHERE $searchCondition;";

  echo $sql; //Echo to test what mysql_query would look like

?>

上記のコードは次のように出力します。

SELECT * FROM students WHERE name LIKE '%John%' OR name LIKE '%Doe%'; 

問題は、複数の列()で検索したいということです$searchFieldName。私は例えば持っています

customer_firstname
customer_lastname

そして、検索文字列を両方の列の内容と照合したいと思います。どのように続行しますか?

4

3 に答える 3

1

テーブルがMyIsamタイプであるか、MyIsamに変換できる場合は、MySQL全文検索を使用してください。そうでない場合は、とにかく、次のような長いクエリを作成できます

SELECT * FROM students WHERE name LIKE '%John%' OR name LIKE '%Doe%' OR lastname LIKE "%John%" OR lastname LIKE "%Doe%"

または、検索のためだけに列を相互に結合します(ただし、この両方は推奨されません)。また、 Sphinxのような全文検索エンジンを使用することも良いアプローチです。

于 2012-07-18T14:07:58.203 に答える
1

多分

  $term = $_SESSION['session_searchstring']; //Let's say that session is John Doe
  $searchterm = explode(' ',$term);

  $searchColumns = array("customer_firstname","customer_lastname");

  for($i = 0; $i < count($searchColumns); $i++)
    {
        $searchFieldName = $searchColumns[$i];
        $searchCondition .= "($searchFieldName LIKE '%" . implode("%' OR $searchFieldName LIKE '%", $searchterm) . "%')";
        if($i+1 < count($searchColumns)) $searchCondition .= " OR ";
     }

  $sql = "SELECT * FROM students WHERE $searchCondition;";

  echo $sql; //Echo to test what mysql_query would look like

生産する

SELECT * FROM students WHERE (customer_firstname LIKE '%John%' OR customer_firstname LIKE '%Doe%') OR (customer_lastname LIKE '%John%' OR customer_lastname LIKE '%Doe%');

于 2012-07-18T14:09:34.053 に答える
0

私の場合、少なくとも1つの列に一致するすべての検索フレーズ/用語が必要でしたが、一致しない検索フレーズ/用語はありませんでした。

カーミットの例を次のように微調整することになりました。

public function getRawWhereFilterForColumns($filter, $search_columns)
{
  $search_terms = explode(' ', $filter);
  $search_condition = "";

  for ($i = 0; $i < count($search_terms); $i++) {
    $term = $search_terms[$i];

    for ($j = 0; $j < count($search_columns); $j++) {
      if ($j == 0) $search_condition .= "(";
      $search_field_name = $search_columns[$j];
      $search_condition .= "$search_field_name LIKE '%" . $term . "%'";
      if ($j + 1 < count($search_columns)) $search_condition .= " OR ";
      if ($j + 1 == count($search_columns)) $search_condition .= ")";
    }
    if ($i + 1 < count($search_terms)) $search_condition .= " AND ";
  }
  return $search_condition;
}

Laravelを使用しているので、Where-clauseのコンテンツのみが必要であり、それをrawWhere-methodに入れることができました。

利用方法:

$search_condition = $this->getRawWhereFilterForColumns
    ("John Doe", array("column1", "column2"));

を生成します

    (column1 LIKE '%John%' OR column2 LIKE '%John%') 
AND (column1 LIKE '%Doe%' OR column2 LIKE '%Doe%')

そして最後に、この$ search_conditionを自分に合った方法で使用します。たとえば、次のようになります。

 $sql = "SELECT * FROM students WHERE $search_condition;";

または私のLaravelの場合:

 $modelInstances = Model::whereRaw
     ($search_condition)->paginate(self::ITEMS_PER_PAGE);

おそらくこれは、元の投稿からほぼ2年経っていても、 Davidまたは私のようなこのスレッドにアクセスする他の人にとっては改善されたソリューションです。

于 2014-04-15T07:45:41.120 に答える