2010-09-01 15 views
7

Mam select gdzie podobne zapytania dotyczącego postaci wyszukiwanego brzmi następująco:PHP SQL SELECT gdzie jak szukanej z wieloma słowami

<?php 
$bucketsearch = sanitizeone($_POST["bucketsearch"], "plain"); 
$bucketsearch = strip_word_html($bucketsearch); 
?> 

if(isset($_POST['search'])){ 
        $result=MYSQL_QUERY("SELECT * FROM buckets where bucketname like '%$bucketsearch%' order by bucketname"); 
       }else{ 
       $result=MYSQL_QUERY("SELECT * FROM buckets order by bucketname"); 
      } 

Moim problemem jest to, że jeśli ktoś szuka na przykład dla „jabłka i gruszki "Nie dostaję żadnych wyników, które zawierają którekolwiek ze słów, mogę tylko sprawić, by zwracał wyniki (1 wynik) ze wszystkimi słowami w nim zawartymi.

Czy ktoś może mi pomóc w dokonaniu tego wyszukiwania nieco bardziej uniwersalnie? Z góry dzięki.

Odpowiedz

30

A więc chcesz wyszukać i użyć każdego z wprowadzonych słów, a nie dokładnego ciągu znaków? O czymś takim:

$searchTerms = explode(' ', $bucketsearch); 
$searchTermBits = array(); 
foreach ($searchTerms as $term) { 
    $term = trim($term); 
    if (!empty($term)) { 
     $searchTermBits[] = "bucketname LIKE '%$term%'"; 
    } 
} 

... 

$result = mysql_query("SELECT * FROM buckets WHERE ".implode(' AND ', $searchTermBits)."); 

to daje zapytania jak:

SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%' 

zmiany AND na OR, jeśli chcesz, aby dopasować dowolny z wyszukiwanych haseł niż wszystkie. Dalsze ulepszenia mogą obejmować zdefiniowanie niektórych słów kończących, takich jak "i", w celu uzyskania lepszych wyników.

+1

Tim, dziękuję! Zajęło mi to około 30 minut grania, skopiowałem moją stronę, żeby ją przetestować, nie mogłem zrozumieć, dlaczego to nie działa, dużo sprawdzenia wszystkiego, potem zrealizowałem dreamweaver dodał "2" do końca mojego wejścia Nazwa!!! grrr. Zmieniłem go na OR i to marzenie! Dziękuję Ci. Teraz wyłącz, aby znaleźć funkcję usuwania słów zatrzymania. Dziękuję za pomoc !! :) – Dan

+0

Dla każdego lawla ppl czytanie to sprawdzić: https://gist.github.com/clouddueling/4967617 –

+0

Dodam tylko, że przy użyciu trybu OR konieczne jest zamknięcie całego warunku zapytania wewnątrz nawiasów(), ponieważ nieoczekiwane wyniki mogą się zdarzyć (chociaż nie wiesz tego, ponieważ nie będzie błędu MySQL per se). Dostałem wyniki z niespokrewnionych kategorii, nawet jeśli określona kategoria została określona w oddzielnym warunku AND. Na przykład zamień powyższe w odpowiedzi Tim: implode ('OR', $ searchTermBits) część z '('. Implode ('OR', $ searchTermBits). ')' – dev101

1

W tym prostym przypadku można zamienić "i" na "%" (ale domyślam się, że szukacie bardziej wyczerpującej odpowiedzi. (Byłoby to również specyficzne dla zamówienia, ponieważ jabłko miałoby przyjść przed gruszką)

0

można podzielić „jabłko i gruszka” na 2 smyczki;.... „jabłko” i „gruszkę” Być może, to można zrobić WHERE bucketname LIKE '%apple%' OR bucketname LIKE '%pear%' nie wiem, czy to pomaga

1

Er. Nie jest to najlepsze rozwiązanie, które można by pomyśleć, ale możesz podzielić słowa na tablicę i zapętlić je na wiele LIKE. Czy niektórzy zamieniają się, aby zerwać ORAZ, OR itd., A następnie uruchomić eksplozję.

Następnie wystarczy pętli.

$ SQL = SELECT * z chwytaki gdzie ";.

pętli tablica, $ SQL =" bucketname LIKE '% "$ arrayEl [I]." % OR'. Po ostatniej iteracji upewnij się, że nie zawiera ona ostatniego OR, ani nie dodaje ostatniego wiersza 0 = 1 itd.

Nie elegancki, nieefektywny, ale w tym przypadku zadziała. Naprawdę lepiej byłoby, gdybyś przeprowadził wyszukiwanie pełnotekstowe, jeśli jest to pole tekstowe.

7

Myślę, że najlepszym rozwiązaniem byłoby użycie wyrażeń regularnych. Jest najczystszy i prawdopodobnie najskuteczniejszy. Wyrażenia regularne są obsługiwane we wszystkich powszechnie używanych silnikach baz danych.

W MySQL jest RLIKE operator więc zapytanie byłoby coś takiego:

SELECT * FROM buckets WHERE bucketname RLIKE "(?=.*apple)(?=.*and)(?=.*pear)" 

did't testowałem go, nadzieję, że moja ekspresja jest dla MySQL regexp „dialekt”.

Więcej na wsparcie regexp MySQL:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

+1

to jest fantastyczne! dzięki! – Dominik

1

Chciałem coś z podstawowej SQL dla mojego wielu wyszukiwania słów w bazie danych MySQL. Więc wymyślam następujące.

$terms=explode(" ",$search); 
$count=count($terms); 
$sql="SELECT * FROM product WHERE";      
for($i=0;$i<$count;$i++) 
{ 
    if($i!=$count-1) 
     $sql = $sql. 
     " (pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR  
      sub_category LIKE '%$terms[$i]%' OR 
      description LIKE '%$terms[$i]%') AND "; 
    else 
     $sql = $sql. 
     "(pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR 
     sub_category LIKE '%$terms[$i]%' OR 
     description LIKE '%$terms[$i]%')"; 
}