Não consegui pensar um título melhor para esse post, desculpe.

Hoje eu precisei de uma solução em sql em um projeto que realizasse uma busca e retornasse os posts que tivessem em seu titulo ou em seu texto o termo buscado.

Porém ele deveria trazer primeiro os posts em que o título começasse com o termo, depois os que tivessem o termo no título e por ultimo os que tivessem o termo na descrição. Como eu não sabia o que fazer para isso fui pesquisar o que poderia resolver meu problema e acabei chegando no seguinte link Stack Overflow .

Baseado no sql do link cheguei a seguinte solução para o meu problema.

select *, CASE WHEN LOWER(titulo) LIKE "termo%" THEN 2 WHEN LOWER(titulo) LIKE "%termo%" THEN 1 ELSE 0 END as ordenar

from posts

where LOWER(titulo) LIKE "%termo%" or LOWER(texto) like "%termo%"

order by ordenar DESC , titulo ASC

Levando isso para a sintaxe do Zend Db ficou assim

$db = Zend_Db_Table::getDefaultAdapter();

$select = $db->select();

$select->from(array('p' => 'posts',array(

'p.*',

new Zend_Db_Expr('CASE WHEN LOWER(p.titulo) LIKE "termo%" THEN 2 WHEN LOWER(p.titulo) LIKE "%termo%" THEN 1 ELSE 0 END as ordenar')

)));

$select->where('LOWER(titulo) like ?','%termo%');

$select->orWhere('LOWER(texto) like ?','%termo%');

$select->order(array('ordenar DESC','p.titulo'));

$result = $db->fetchAll($select);

Onde o $result será um array que traz primeiro os resultados em que o termo está no começo do titulo depois os que estiverem no título e por fim os que estiverem no texto do post.