Potresti usare funzioni di stringa, come:
select id, name
from subjects
where name like concat('%', @search, '%')
order by
name like concat(@search, '%') desc,
ifnull(nullif(instr(name, concat(' ', @search)), 0), 99999),
ifnull(nullif(instr(name, @search), 0), 99999),
name;
Questo ti dà tutte le voci che contengono @search. Prima quelli che ce l'hanno all'inizio, poi quelli che ce l'hanno dopo uno spazio vuoto, poi dalla posizione dell'occorrenza, poi in ordine alfabetico.
name like concat(@search, '%') desc
usa la logica booleana di MySQL tra l'altro. 1 =vero, 0 =falso, quindi ordinare questo discendente ti dà prima vero.
Fiddle SQL:http://sqlfiddle.com/#!9/c6321a/1