2010-10-26 8 views
0

J'essaie de rechercher des termes qui peuvent ou non avoir un espace ... ex terme: iPod Black 30. les résultats seraient tout sauf, "ipod noir utilisé 30" et "utilisé ". Donc, fondamentalement, il trouve tous les termes correspondants complets des termes correspondants individuels et en ignorant toute entrée qui peut correspondre mais qui contient un mot qui ne correspond pas et bien sûr l'entrée où rien ne correspond.php/mysql chaîne de requête de recherche

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

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

Répondre

3

Rompez le terme recherché en chaînes individuelles. Ensuite, utilisez les chaînes individuelles dans votre requête pour une correspondance exacte entre les tables.

Exemple de code:

$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

Pouvez-vous créer de nouvelles tables? Par exemple, vous pouvez créer une table "terms" qui a de nombreuses relations avec les tables prod et types. Ensuite, vous pouvez implémenter cette logique comme ceci:

-- 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 

Ensuite, vous pouvez faire quelque chose de similaire pour la table des types.

mises en garde:

  • Je suis plus familier avec SQL Server, la syntaxe peut nécessiter peaufinage pour MySQL
  • La requête illustre la idée générale, mais peut aboutir à un plan de requête lente, alors assurez-vous de faire perf tuning