2012-06-21 10 views
18

Tengo la siguiente consulta:Ordene SQL por el más fuerte LIKE?

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

hay una estrategia para ordenar sobre la base de los resultados más relevantes?

+1

Por "más relevante" , ¿quiere decir que una coincidencia en 'col_1' toma mayor prioridad que una coincidencia en' col_2', y así sucesivamente? – Wiseguy

+0

¿Qué constituye los resultados más relevantes? – codewaggle

+0

¿quisiste decir "filtrar" en lugar de "ordenar"? – Sebas

Respuesta

26

Cuando se habla de "relevancia ", realmente desea la búsqueda en lenguaje natural, que es compatible con MySQL full-text searches. La sintaxis es diferente a la normal como consultas, y debe agregar un índice especial a la tabla, pero el orden por relevancia es posible de esta manera.

Así es como MySQL calcula relevancia (desde el enlace):

Cuando se utiliza match() en una cláusula WHERE, como en el ejemplo mostrado anteriormente, las filas devueltas se clasifican automáticamente con la más alta relevancia primera . Los valores de relevancia son números de punto flotante no negativos. Cero relevancia significa que no hay similitud. La relevancia se calcula en función del número de palabras en la fila, el número de palabras únicas en esa fila, el número total de palabras en la colección y el número de documentos (filas) que contienen una palabra en particular.

Para create a full-text index on an existing table, utilice el FULLTEXT modificador:

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

continuación, puede realizar una consulta como esta para recuperar los resultados en orden de relevancia:

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

No puede. Le está pidiendo a su RDBMS que ordene los resultados por filas con la mayoría de las coincidencias de columna "ME GUSTA".

MySQL, por ejemplo, hace esto con lo que se llama un índice FULLTEXT.

28

Si se refiere a que col_1 es más relevante que col_2 y así sucesivamente, entonces:

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] 

si nos referimos con el partido de la columna más a continuación:

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 para crear una clasificación personalizada – Wiseguy

+0

Acaba de probarlo, no necesita la subconsulta, actualizando la respuesta. –

+4

No sé si soy solo yo, pero tuve que eliminar las ** comas después de los más (_ + _) ** y ** corchetes (_ [] _) de '[prioridad]' ** para el código para trabajar – Giraldi

Cuestiones relacionadas