Ordenar SQL por más fuerte LIKE?

Tengo la siguiente consulta:

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

¿Existe una estrategia de sorting basada en los resultados más relevantes?

Cuando habla de "relevancia", realmente desea la búsqueda en lenguaje natural, que es compatible con las búsquedas de text completo de MySQL. La syntax es diferente de lo normal, como las consultas, y debe agregar un índice especial a la tabla, pero el order por relevancia es posible de esta manera.

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

Cuando se utiliza MATCH () en una cláusula WHERE, como en el ejemplo mostrado anteriormente, las filas devueltas se orderan automáticamente con la mayor relevancia primero. Los valores de relevancia son numbers de punto flotante no negativos. Cero relevancia significa que no hay similitud. La relevancia se calcula en function 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 crear un índice de text completo en una tabla existente , use el modificador FULLTEXT :

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

Luego puede realizar una consulta como esta para recuperar los resultados en order de relevancia:

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

Si quiere decir 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 te referías con la mayor coincidencia de columna, entonces:

 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 

No puedes. Le está pidiendo a su RDBMS que ordere 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 .