Ícone do site Linha de Comando

Como ordenar corretamente valores como M1/2026 no MySQL

Como ordenar corretamente valores como M1/2026 no MySQL

🎯 Problema

Você tem uma coluna no MySQL gravando valores assim:

M2/2026
M1/2024
M4/2025
M3/2025
M1/2026
M2/2025
M1/2025

Se fizer apenas:

ORDER BY periodo DESC;

A ordenação será alfabética, não cronológica.

Mas você precisa que o resultado fique assim:

M2/2026
M1/2026
M4/2025
M3/2025
M2/2025
M1/2025
M1/2024

Ou seja:


🧱 Exemplo Completo

1️⃣ Criando tabela fictícia


CREATE TABLE periodos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    periodo VARCHAR(10) NOT NULL
);

2️⃣ Inserindo dados


INSERT INTO periodos (periodo) VALUES
('M2/2026'),
('M1/2024'),
('M4/2025'),
('M3/2025'),
('M1/2026'),
('M2/2025'),
('M1/2025');

🚀 Solução Correta

Precisamos:

Query correta:


SELECT *
FROM periodos
ORDER BY 
    CAST(SUBSTRING_INDEX(periodo, '/', -1) AS UNSIGNED) DESC,
    CAST(REPLACE(SUBSTRING_INDEX(periodo, '/', 1), 'M', '') AS UNSIGNED) DESC;

🧠 Explicação

Extrair o ano


SUBSTRING_INDEX(periodo, '/', -1)

Retorna apenas o ano (ex: 2026).

Extrair o módulo


SUBSTRING_INDEX(periodo, '/', 1)

Retorna “M2”.

Depois removemos o “M”:


REPLACE(SUBSTRING_INDEX(periodo, '/', 1), 'M', '')

E convertemos para número com:


CAST(... AS UNSIGNED)

🎯 Resultado Final

M2/2026
M1/2026
M4/2025
M3/2025
M2/2025
M1/2025
M1/2024

💡 Dica Profissional

Se você usa isso com frequência, o ideal é não armazenar tudo em uma única coluna.

Estrutura recomendada:


CREATE TABLE periodos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    modulo INT,
    ano INT
);

Assim sua ordenação fica simples e performática:


ORDER BY ano DESC, modulo DESC;

Mais limpo. Mais rápido. Mais profissional.

Sair da versão mobile