1

ご存知のように、MySQLはLIKEとLIMITで結果を取得できますが、私の問題は、DBで文字列のいくつかの単語を1つずつ検索し、重複せずに結果を表示する方法です。

私の手段は、たとえば、ユーザーが「phpとmysqlの本」を検索するときに、Forループでクエリを送信します。

SELECT * FROM table WHERE title LIKE %i% LIMIT 5

しかし、このコードは重複した結果を示しています。実際、各単語については5つの結果が表示され、別の単語については別の5つの結果が表示されます。私の貧弱な英語でごめんなさい:)

4

3 に答える 3

2

私はコメントとあなたの質問を読んでいます、そしてあなたはあなたのMySqlステートメントを準備するために少しのPHPと、繰り返される項目なしで最初の5つに制限された一致する結果をフェッチするためのMysqlクエリが必要だと思いますか?

もしそうなら!!

PHP

<?php
  $searchFieldData = $_POST['search'];
  $searchArr = explode(" ", $searchFieldData);

  $sqlWhere = '';
  $count = count($searchArr);
  foreach ($searchArr as $or) {
    $sqlWhere.= " title LIKE '%".$or."%' ";
    if ($count>1) $sqlWhere.= " OR ";
    $count--;
  }

  $query = "SELECT col1, col2, ... FROM table WHERE ".$sqlWhere." LIMIT 5";
?>

上記のコードは、検索語「スーパーハイパークエリクローラー」に対して返されます。

SELECT col1、col2、... FROM table WHERE title LIKE'%super%' OR title LIKE'%hyper%' OR title LIKE'%query%' OR title LIKE'%crawler%' LIMIT 5


今MYSQLマジックのために

結果を繰り返したくない場合は、次を使用してください:GROUP BY'title'

最終的なクエリは次のようになります。

$query = "SELECT col1, col2, ... FROM table WHERE ".$sqlWhere." GROUP BY 'title' LIMIT 5";
于 2012-04-27T19:37:22.500 に答える
1

私はあなたがこのようなものが欲しいと思います:

SELECT col1, col2, ...
FROM table
WHERE title LIKE '%a%' OR title LIKE '%b%' OR title LIKE '%c%'
LIMIT 5

ノート:

  • 大規模なデータセットの場合、使用LIKE '%xxx%'には時間がかかります。代わりに、インデックス付き全文検索の使用を検討してください。
  • 'a'や'the'のような単語を検索すると、多くの役に立たない一致が得られる可能性があります。一致の関連性を向上させるために、ストップワードリストまたはその他のアプローチを使用することを検討してください。
于 2012-04-27T18:53:11.607 に答える
1

MySQLだけでこれを達成したいですか?PHPで1つ表示します:

$result = array();
$excludeIds = array(); //store recored id already got
$words = explode(" ", $_POST['input']);
foreach($words as $word) {

  //if there is no 'id' column, use another one instead
  $condForNoDup = ($excludeIds) ?
    "AND id NOT IN (".implode(',', $excludeIds).")" : "";

  $word = '%'.mysql_real_escape_string($word).'%';
  $sql = "SELECT * FROM table
          WHERE title LIKE '{$word}' {$condForNoDup}
          LIMIT 5";

  //executeQuery() returns array which has 'id' as key
  if($_result = executeQuery($sql)) {
    $excludeIds = array_merge($excludeIds, array_keys($result));
    $result = array_merge($result, $_result);
  }
}
print_r($result);

ぎこちない...MySQLだけで賢い答えも知りたい:)

于 2012-04-27T20:00:36.277 に答える