1

正如我们所知,MySQL 可以通过 LIKE 和 LIMIT 获得结果,但我的问题是我们如何在数据库中逐个搜索字符串的某些单词并显示结果而不重复?

我的方法是,例如,当用户搜索“a book for php and mysql”时,我们在 For 循环中发送查询,逐字发送到 DB:

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

但是这段代码只显示重复的结果,实际上对于每个单词它显示 5 个结果,然后为另一个单词显示另外 5 个结果,并且...我需要一个一个地搜索 db 单词,但最后只显示 5 个匹配结果而不重复!对不起我糟糕的英语:)

4

3 回答 3

2

我一直在阅读评论和你的问题,我认为你需要一点 PHP 来准备你的 MySql 语句,以及一个 Mysql 查询来获取限制在前 5 个没有重复项的匹配结果?

如果是这样!!

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展示了一个:

$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 回答