Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde,
Alguém poderia me dar uma ajudar em como que eu faço para ordenar duas colunas ao mesmo tempo de uma tabela com a clausula ORDER BY no MySql ? Preciso ordenar a coluna de ID em ASC e a coluna de saldo em DESC. Já tentei da seguinte forma abaixo porém o resultado não é o esperado, pois só ordena a coluna de SALDO e não afeta na coluna de ID:
SELECT id_transacao, tran_data_movimentacao, tran_valor, tran_saldo
FROM tb_transacao
WHERE tran_data_movimentacao BETWEEN '2016-02-01' AND '2016-02-30'
ORDER BY tran_saldo DESC, id_transacao ASC;
Agradeço desde já.
Mas está separado por vírgulas, porém por algum motivo não está funcionando...
Atente a ORDEM das colunas pois as colunas prevalecem na ordem que são citadas no ORDER BY.
Invertendo as colunas também não funciona corretamente como o esperado, se colocar ORDER BY id_transacao ASC, tran_saldo DESC só ordena a primeira coluna, a segunda nunca é afetada pela ordenação.
Cara dá um exemplo do que você espera e o que está vindo.
@JorgitoDF, a ordenação ocorre na primeira coluna citada no ORDER BY, se houver campos iguais na primeira coluna, a segunda coluna do ORDER BY é ordenada. A ordem dos campos é a ordem de prioridade.
SELECT id_transacao, tran_data_movimentacao, tran_valor, tran_saldo
FROM tb_transacao
WHERE tran_data_movimentacao BETWEEN '2016-02-01' AND '2016-02-30'
ORDER BY tran_saldo DESC, id_transacao ASC;
O resultado sai assim:
1178 2016-02-01 47.40 35602.18
1179 2016-02-01 30.00 35572.18
1177 2016-02-01 736.50 35554.78
1180 2016-02-01 30.00 35542.18
1181 2016-02-04 15.99 35526.19
1182 2016-02-04 2.49 35523.70
Pelo comando acima o esperado resultado deveria ser assim:
1177 2016-02-01 736.50 35554.78
1178 2016-02-01 47.40 35602.18
1179 2016-02-01 30.00 35572.18
1180 2016-02-01 30.00 35542.18
1181 2016-02-04 15.99 35526.19
1182 2016-02-04 2.49 35523.70
Não entendi o objetivo, pois os campos são únicos, a ordenação funciona em um, ou no outro, porque mesmo o saldo, dificilmente, será igual em alguma outra data. E acredito que o id seja PK AI.
Se mandou ordenar o saldo de forma descendente e dentro dos saldos os id de forma ascendente , e foii o que foi feito.
>
SELECT id_transacao, tran_data_movimentacao, tran_valor, tran_saldo
FROM tb_transacao
WHERE tran_data_movimentacao BETWEEN '2016-02-01' AND '2016-02-30'
ORDER BY tran_saldo DESC, id_transacao ASC;
O resultado sai assim:
1178 2016-02-01 47.40 35602.18
1179 2016-02-01 30.00 35572.18
1177 2016-02-01 736.50 35554.78
1180 2016-02-01 30.00 35542.18
1181 2016-02-04 15.99 35526.19
1182 2016-02-04 2.49 35523.70
Pelo comando acima o esperado resultado deveria ser assim:
1177 2016-02-01 736.50 35554.78
1178 2016-02-01 47.40 35602.18
1179 2016-02-01 30.00 35572.18
1180 2016-02-01 30.00 35542.18
1181 2016-02-04 15.99 35526.19
1182 2016-02-04 2.49 35523.70
Nop... como disse o Motta a consulta rodou certo, ordenando primeiro por saldo desc (maior saldo primeiro) e depois por transacao asc (menor transacao primeiro).
Pra exibir o resultado que vc deseja seria necessario inverter a ordem do ORDER BY. Ou seja:
ORDER BY id_transacao ASC , tran_saldo DESC
Mais importante a ordem que vc chama os campos no select nao tem nada a ver com a ordem na qual os dados serao exibidos. Isso é controlado unico e exclusivamente no ORDER BY.
Está correto, é só separar por vírgulas.
http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html