2012-04-27 106 views
1

我们知道,MySQL可以通过LIKE和LIMIT得到结果,但我的问题是我们如何在DB中搜索一个字符串的单词,显示结果没有重复?mysql查询结果为字符串单词一个接一个LIKE和LIMIT

我的方法是,例如,当用户做搜索“一书,为PHP和MySQL”我们在发送查询循环,到词到DB:

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

但是这个代码只显示重复的结果,实际上每个单词显示5个结果,然后换一个单词另一个单词5个结果,...我需要逐个搜索db单词,但最后只显示5个匹配结果,没有重复!对不起,我的英文不好:)

+0

您能否给一些数据的一个例子,您预期的结果集,用于查询数据? – 2012-04-27 18:51:29

+0

请通过一个例子来解释你的问题。 – Nishant 2012-04-27 18:52:52

+1

您可以在每个查询之间使用UNION。这将删除重复项。 – 2012-04-27 18:52:53

回答

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表WHERE标题LIKE'%super%'或标题LIKE'%hyper%'或标题LIKE'%query%'或标题LIKE'%crawler%'LIMIT 5


现在的MYSQL MAGIC

如果你不希望任何重复的结果,只需使用:GROUP BY '标题'

和最终的查询是:

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

@Mark Byers,马克·拜尔斯,花了我一段时间来测试这个,发布后有你的答案......你可能认为这是一个改进,而不是重复:) – Zuul 2012-04-27 19:39:32

+0

不错的代码!我认为这是最好的主意!谢谢各位朋友。 – Vahid 2012-04-28 07:18:53

1

我想你想是这样的:

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

注:

  • 使用LIKE '%xxx%'是大数据集的缓慢。考虑使用索引全文搜索。
  • 搜索“a”或“the”这样的单词可能会导致大量无用的匹配。考虑使用停用词表或其他方法来改善匹配的相关性。
+0

我知道这个!但如果单词超过3或更少,我该怎么办?所以你可以看到它不是一个动态的方式! – Vahid 2012-04-27 19:05:12

+0

@vahid:您可以动态构建查询。 – 2012-04-27 19:35:50

+0

你是对的!我现在通过“Zuul”的帮助。 – Vahid 2012-04-28 07:24:25

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聪明的答案:)

相关问题