2011-08-21 50 views
0

我想为我的网站创建一个搜索查询类的东西,我知道我可以使用简单的'%string%'来获得类似结果的东西,但这意味着你必须输入您尝试查找的文章/字符串的文字的确切顺序。搜索和多个MYSQL请求排序

例如,如果您输入“One Three Two”,则只能找到在该字符串中的任意位置具有“One Three Two”顺序的文章...并且无法搜索类似以下内容的文章:“One二进三”等

于是我想到了一个解决方案,但我没有想到的是如何真正制定出解决方案......这是我的思想行动程序:

  1. 爆炸()的字符串输入到所有单词中
  2. mysql用%查询每个单词一个一个%like%
  3. 如果有所有单词的文章,它将首先显示,所以它按同一篇文章的大部分出现次序排序。

就是这样!所以我只是想知道如果这是甚至可以实现使用PHP?还是我必须回到Perl或其他?

回答

0

当然可以。在MySQL中真正的表达式是1,所以只需将它们加在一起并按顺序排列即可。

mysql> select ('ABC' LIKE '%B%') + ('ABC' LIKE '%C%'); 
+-----------------------------------------+ 
| ('ABC' LIKE '%B%') + ('ABC' LIKE '%C%') | 
+-----------------------------------------+ 
|          2 | 
+-----------------------------------------+ 
1 row in set (0.02 sec) 

,只是使用ORWHERE子句,以获得相匹配的任何物品。

SELECT ... 
    WHERE 'ABC' LIKE '%B%' OR 'ABC' LIKE '%C%' 
0

您可能还想考虑全文搜索。设置起来要困难得多,但可以使搜索更像搜索引擎。找到具有相关关键字的额外结果可能非常有价值。此外,应该处理爆炸的短语(三个词放在一起)内部,你只要把它传递什么样的用户提供了:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

0

创建查询,使得它的各种搜索的结合,跟随你的主意,让前面的最匹配:

例如,对于你3个字

select 1 as levl, text from table where text like '%w1%' or text like '%w2%' or text like '%w3%' 
union 
select 2 as levl, text from table where text like '%w1%' or text like '%w2%' 
union 
select 2 as levl, text from table where text like '%w2%' or text like '%w3%' 
union 
select 2 as levl, text from table where text like '%w1%' or text like '%w3%' 
union 
select 3 as levl, text from table where text like '%w1%' 
union 
select 3 as levl, text from table where text like '%w2%' 
union 
select 3 as levl, text from table where text like '%w3%' 
order by levl 

注意,一个字的部分提取为好。如果你只想要整个单词,请在php中解析结果中的每一行,以消除不正确的结果。 Sql将主要选择器,你做炼油厂。