2010-10-26 235 views
0

我试图搜索可能有或没有空间的术语...... ex术语:iPod Black 30.结果将是除“ipod black used 30”和“used ”。所以基本上它找到所有完全匹配条件的单个匹配条件并跳过任何可能匹配的条目,但是匹配词不匹配,当然还有没有匹配的条目。php/mysql搜索查询字符串

table: 
prod 
-- ipod black 30 
-- ipod 30 
-- ipod black used 30 

types 
-- ipod 
-- 30 
-- black 
-- used 

回答

3

将搜索项分解为单个字符串。然后使用查询中的单个字符串进行跨表格的精确匹配。

示例代码:

$terms = array(); 
$terms = explode(" ",$searchstr); 

$sql = "select fields from tables where"; 

$first = true; 

foreach($terms as $term) 
{ 

    if(!$first) $sql .= " OR " 

    $sql .= "fieldA like ('%".trim($term)."%')"; 

    $first = false; 

} 

// execute query! 
1

您可以创建新表?例如,您可以创建一个“词条”表,该表与prod和types表有许多关系。然后,你可以实现这样的逻辑:

-- get the set of all products which contain your terms 
select p.id from prod p 
inner join prod_terms pt on (p.id = pt.prod_id) 
inner join terms t on (pt.term_id = t.id) 
where t.term IN (<dynamically built list of terms>) 
-- exclude products which contain terms not in your query 
and not exists (
    select pt.id from prod_terms pt2 
    inner join terms t2 on (pt.term_id = t.id) 
    where t2.term NOT IN (<dynamically built list of terms>) 
) other_terms 

然后,你可以为类型表做类似的事情。

注意事项:

  • 我更熟悉的SQL Server, 的语法可能需要扭捏作 MySQL的
  • 查询说明 一般的想法,但可能会导致一个缓慢 查询计划,所以一定要做perf 调整