2010-08-31 9 views
20

suppose que nous accomplissons des mots-clés à l'aide de la recherche: keyword1, keyword2, mot clé3Mysql: Trier par comme?

il y a des enregistrements dans la base de données avec la colonne "nom":

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

maintenant Requête:

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

il sera sélectionner des enregistrements: 1,2,3 (dans cet ordre) mais je veux le commander par mot-clé dans l'exemple keyword1=John, keyword2=Doe alors il devrait être répertorié par mots-clés: 1,3,2 (parce que je veux effectuer une recherche pour « Doe » après avoir cherché « John »)

Je pensais à SELECT DISTINCT FROM (...... UNION .....) mais il sera beaucoup plus facile de le commander en quelque sorte d'une autre manière (requête réelle est vraiment long)

y at-il des astuces pour créer une telle commande?

Répondre

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

oui, qui fonctionne, je vous remercie :) – dfens

+0

une chose - si je comprends correctement tous LIKE être exécuté 2 fois dans la requête entière? – dfens

+0

@dfens: Je suppose que le 'LIKE' de la clause' ORDER BY' ne s'exécutera que sur les données correspondant à la clause 'WHERE', donc il devrait être plus rapide. – 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

Pour construire sur la réponse de RedFilter, vous pouvez faire les lignes qui ont à la fois des mots clés pour être en haut:

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

Mon exemple ordonnera tous les John « s alphabétiquement suivie par le Doe 's.

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