Você pode usar funções de string, como:
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;
Isso obtém todas as entradas contendo @search. Primeiro os que o têm no início, depois os que o têm depois de um branco, depois pela posição da ocorrência, depois por ordem alfabética.
name like concat(@search, '%') desc
usa a lógica booleana do MySQL a propósito. 1 =verdadeiro, 0 =falso, portanto, ordenar essa ordem decrescente fornece verdadeiro primeiro. violino SQL:http://sqlfiddle.com/#!9/c6321a/1