Esses dias pra trás, em umas das telas do sistema que estou trabalhando precisei forçar a ordenação no MySQL, numa query do tipo SELECT, até então nunca pensado em tal possibilidade e fui pesquisar sobre.
Não achei nenhuma solução em português e contei com a ajuda de um amigo para pesquisar pelo termo correto no Google: MAINTain order “in” mysql.
Bom, vamos à explicação e código.
Caso nenhum dos campos da tabela atenda a sua necessidade de ordenação ou você necessitar dos seus dados ordenados de uma maneira muito particular, trazer na mesma ordem que uma session de carrinho de compras por exemplo, use a seguinte lógica:
SELECT * FROM tbl_name WHERE column_a IN (val1,val2,val3) ORDER BY FIELD(column_a, val1, val2, val3);
Na prática, vamos imaginar que eu tenho uma tabela ‘produtos’, com a seguinte estrutura:
Produtos ---------------------------- id_produto int(10) produto varchar(80) descricao text
Bom, o usuário entrou no meu site, e foi clicando nos produtos, na seguinte ordem: 15,2,36,41,10. Essa ordem não segue nenhuma lógica.
E eu quero, quando ele clique no carrinho de compras, eu faça uma única SELECT, usando o IN para trazer a lista de produtos, mas quero eles nessa ordem, que o meu usuário escolheu.
Como fazer isso? Simples:
/** * Minha session * $_SESSION['produtos'] = array(15,2,36,41,10); */ if(is_array($_SESSION['produtos'])) { $produtos = implode(',',$_SESSION['produtos']); $query = mysql_query('SELECT * FROM produtos WHERE id_produto IN ('.$produtos.') ORDER BY FIELD(id_produto,'.$produtos.')'); while($row=mysql_fetch_assoc($query)) { echo $row['id_produto'].' - '.$row['produto'].'<br />'; } mysql_free_result($query); }
Bom, agora é testar e brincar com a lógica.
PS: se você não sabe para que serve o comando implode, pesquise no manual do PHP. (:P)
Abraços!