2010-08-31 22 views
20

suponer que estamos llevando a cabo la búsqueda con las palabras clave: keyword1, keyword2, la palabra clave3Mysql: ordenar por similares?

hay registros en la base de datos con la columna "Nombre":

 
1: John Doe 
2: Samuel Doe 
3: John Smith 
4: Anna Smith 

ahora consulta:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%") 

lo hará seleccione registros: 1,2,3 (en este orden) pero quiero ordenarlo por palabra clave en el ejemplo keyword1=John, keyword2=Doe , por lo que debe aparecer por palabras clave: 1,3,2 (porque quiero realizar la búsqueda de "Doe" después de buscar "John")

Estaba pensando en SELECT DISTINCT FROM (...... UNION .....) pero será mucho más fácil pedirlo de alguna manera de otra manera (la consulta real es realmente largo)

¿Hay algún truco para crear tal orden?

Respuesta

46
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%" then 2 
    else 3 
end 
+0

sí, que funciona, gracias :) – dfens

+0

una cosa más - si entiendo correctamente todos los COMO será ejecutado 2 veces en toda consulta? – dfens

+0

@dfens: Supongo que el 'LIKE' en la cláusula' ORDER BY' se ejecutará solo en los datos que coincidan con la cláusula 'WHERE', por lo que debería ser más rápido. – RedFilter

2
SELECT * 
from 
(
    SELECT u.*, 1 OrderNum 
    FROM users 
    WHERE (name LIKE "%John%") 
    UNION 
    SELECT u.*, 2 OrderNum 
    FROM users 
    WHERE (name LIKE "%Doe%") 
) 
    Order by OrderNum 
2

Para construir sobre la respuesta de RedFilter, usted podría hacer las filas que tienen ambas palabras clave para estar en la parte superior:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2 
when name LIKE "%Doe%" then 3 
end 
0

Mi ejemplo ordenará todos los John 's alfabéticamente seguido por el Doe es

ORDER BY CASE 
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name) 
    WHEN name LIKE "John%" THEN CONCAT('b',name) 
    WHEN name LIKE "%Doe"  THEN CONCAT('c',name) 
    ELSE name 
END