带有 LIKE 和 LIMIT 的字符串单词的 mysql 查询结果


mysql query result for a string words one by one with LIKE and LIMIT

正如我们

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

我的意思是,例如,当用户搜索"一本关于PHP和MySQL的书"时,我们在For循环中发送查询,逐字逐句地发送到数据库:

SELECT * FROM table WHERE title LIKE %i% LIMIT 5
但是这段代码只显示重复的结果,事实上,对于每个单词,它显示 5 个结果,然后对于

另一个单词,它显示另外 5 个结果,然后...... 我需要一一搜索数据库的单词,但最后只显示 5 个匹配结果而没有重复! 对不起,我的英语不好:)

我一直

在阅读评论和您的问题,我认为您需要一些 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";
?>

上面的代码将返回搜索词:"超级超级查询爬虫"

选择col1,col2,...从表中,

标题类似于"%super%"或标题类似于"%超%"或标题类似于"%query%"或标题类似于"%爬网程序%"限制 5

现在是 MYSQL 的魔力

如果您不想要任何重复的结果,只需使用:按"标题"分组

您的最终查询将是:

$query = "SELECT col1, col2, ... FROM table WHERE ".$sqlWhere." GROUP BY 'title' LIMIT 5";

我想你想要这样的东西:

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

笔记:

  • 对于大型数据集,使用 LIKE '%xxx%' 很慢。请考虑改用索引全文搜索。
  • 搜索像"a"或"the"这样的单词可能会给出很多无用的匹配。考虑使用非索引字列表或其他方法来提高匹配项的相关性。

您是否只想通过 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的智能答案:)