2012-06-21 16 views
18

Mam następujące zapytanie:Zamówić SQL według najsilniejszych LIKE?

SELECT * FROM table_name 
WHERE (col_1 LIKE '%$keyword%' 
    OR col_2 LIKE '%$keyword%' 
    OR col_3 LIKE '%$keyword%') 
    AND .... <some optional filters> ... 

istnieje strategia sortować na podstawie najbardziej odpowiednich wyników?

+1

Przez "najbardziej istotne" Czy masz na myśli, że mecz na 'col_1' ma wyższy priorytet niż mecz na' col_2' i tak dalej? – Wiseguy

+0

Co stanowi najbardziej istotne wyniki? – codewaggle

+0

miałeś na myśli "filtrować" zamiast "sortować"? – Sebas

Odpowiedz

26

Kiedy można mówić o „znaczenie ", naprawdę chcesz wyszukiwania w języku naturalnym, który jest obsługiwany przez MySQL full-text searches. Składnia różni się od zwykłych zapytań, takich jak: , takich jak:, a do tabeli należy dodać specjalny indeks, ale w ten sposób możliwe jest porządkowanie według trafności.

Oto jak MySQL oblicza trafności (od link):

Kiedy MATCH() jest używana w klauzuli WHERE, tak jak w przykładzie przedstawionym wcześniej wiersze zwracane są automatycznie sortowane z najwyższą pierwszej znaczenie . Wartości istotności są nieujemnymi liczbami zmiennoprzecinkowymi. Zero relevance oznacza brak podobieństwa. Trafność jest obliczana na podstawie liczby słów w wierszu, liczby unikalnych słów w tym wierszu, łącznej liczby słów w kolekcji oraz liczby dokumentów (wierszy) zawierających dane słowo.

Aby create a full-text index on an existing table użyj FULLTEXT modyfikator:

CREATE FULLTEXT INDEX index_name 
ON table_name (col1, col2, col3) 

Następnie można wykonać kwerendę tak, aby pobrać wyniki w kolejności znaczenie:

SELECT * FROM table_name 
WHERE MATCH (col1,col2,col3) 
AGAINST ('keyword' IN NATURAL LANGUAGE MODE); 
3

Nie możesz. Zadajesz RDBMS polecenie sortowania wyników według wierszy z największą liczbą "LIKE" odpowiadających malejącym kolumnom.

MySQL, na przykład, robi to z tak zwanym indeksem FULLTEXT.

28

Jeśli masz na myśli, że col_1 jest bardziej istotne niż col_2 i tak dalej, a następnie:

select * 
     ,case when col_1 like '%$keyword%' then 1 
      when col_2 like '%$keyword%' then 2 
      when col_3 like '%$keyword%' then 3 
     end as [priority] 
    from table_name 
where col_1 like '%$keyword%' 
    or col_2 like '%$keyword%' 
    or col_3 like '%$keyword%' 
order by [priority] 

Jeśli masz na myśli z najbardziej kolumny meczu następnie:

select * 
     ,(case when col_1 like '%$keyword%' then 1 else 0 end) + 
     ,(case when col_2 like '%$keyword%' then 1 else 0 end) + 
     ,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority] 
    from table_name 
where col_1 like '%$keyword%' 
    or col_2 like '%$keyword%' 
    or col_3 like '%$keyword%' 
order by [priority] desc 
+3

+1 do tworzenia niestandardowego rankingu – Wiseguy

+0

Po prostu przetestowany, nie potrzebujesz podzapytania, aktualizując odpowiedź. –

+4

Nie wiem, czy to tylko ja, ale musiałem usunąć ** przecinki po plusach (_ + _) ** i ** nawiasy (_ [] _) z '[priority] ** dla kod do pracy. – Giraldi