GROUP BY com Campos Escondidos


O MariaDB tem extendido o uso de GROUP BY. Você pode utilizar colunas ou cálculos na expressão SELECT que não aparecem na parte GROUP BY. Ele espera por qalquer valor possível para este grupo. Você pode utilizar isto para conseguir um melhor desempenho evitando ordenação e agrupamento em itens desnecessários. Por exemplo, você não precisa fazer um agrupamento em cliente.nome na consulta seguinte:

mysql> SELECT pedido.idcliente,cliente.nome,MAX(pagamento)
 -> FROM pedido, cliente
 -> WHERE pedido.idcliente = cliente.idcliente
 -> GROUP BY pedido.idcliente;

No padrão SQL, você teria que adicionar cliente.nome a cláusula GROUP BY. No MySQL, o nomê é redundante se você não o executa em modo ANSI.

Não utilize este recurso se as colunas omitidas na parte GROUP BY não são únicas no grupo! Você obterá resultados inexperados.

Em alguns casos, você pode utilizar MIN e MAX para obter o valor de uma coluna específica, mesmo que ele não seja único. O exemplo seguinte fornece o valor de coluna do registro contendo o menor valor na coluna ordem:

SUBSTR(MIN(CONCAT(RPAD(ordem,6,' '),coluna)),7)

See "As Linhas Armazenando o Group-wise Máximo de um Certo Campo".

Note que se você estiver usando a versão 3.22 do MariaDB (ou anterior) ou se estiver tentando seguir o SQL-99, você não pode utilizar expressões nas cláusulas GROUP BY or ORDER BY. Você pode contornar esta limitação utilizando um alias para a expressão:

mysql> SELECT id,FLOOR(value/100) AS val FROM nome_tabela
 -> GROUP BY id,val ORDER BY val;

Na versão 3.23 do MariaDB você pode fazer:

Retornar