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:
- Primeiro ordenar por ano (DESC)
- Depois ordenar por módulo (DESC)
🧱 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:
- Extrair o ano
- Extrair o número do módulo
- Ordenar separadamente
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.