次のような文字列関数を使用できます:
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;
これにより、@searchを含むすべてのエントリが取得されます。最初にそれを持っているもの、次に空白の後にそれを持っているもの、次に出現の位置、そしてアルファベット順。
name like concat(@search, '%') desc
ちなみに、MySQLのブール論理を使用しています。 1 =true、0 =falseなので、この降順で並べ替えると、最初にtrueになります。
SQLフィドル: http://sqlfiddle.com/#!9/c6321a/1 >