通过多个MYSQL请求进行搜索和排序

时间:2011-08-21 06:20:37

标签: php mysql

我正在尝试为我的网站创建一个搜索查询类型的东西,我知道我可以使用简单的'%string%'来获得具有类似结果的东西,但这意味着你必须输入确切的顺序你试图找到的文章/字符串的单词。

例如,如果您输入“One Three Two”,您只能在字符串中的任何位置找到具有“One Three Two”顺序的文章...并且它无法搜索如下所示的内容:“One Two三个“等等。

所以我想到了一个解决方案,但我还没想过如何实际解决这个问题......这是我的思考过程:

  1. 将字符串分解为所有输入的单词
  2. mysql使用%like%
  3. 逐个查询每个单词
  4. 如果有包含所有单词的文章,它将首先显示,因此它按照同一篇文章的大多数出现进行排序。
  5. 就是这样!所以我只是想知道这是否甚至可以使用PHP实现?或者我必须回到Perl或其他什么地方?

3 个答案:

答案 0 :(得分: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)

只需在OR子句中使用WHERE即可获得匹配的文章。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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将是主选择器,你可以进行炼油厂。