Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como o GROUP BY DESC seleciona seu pedido?

SELECT * FROM my_table GROUP BY section_identifier

é um SQL inválido inquerir.

Como GRUPAR POR funciona?


Vamos pegar a consulta acima e ver como GROUP BY funciona. Primeiro, o mecanismo de banco de dados seleciona todas as linhas que correspondem ao WHERE cláusula. Não há ONDE cláusula nesta consulta; isso significa que todas as linhas da tabela são usadas para gerar o conjunto de resultados.

Em seguida, ele agrupa as linhas usando as expressões especificadas no GROUP BY cláusula:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier    | store_id |
+----+--------------------+----------------------+----------+
| 17 | header             | header_option_one    |        1 |
| 23 | header             | header_option_three  |        0 |
+----+--------------------+----------------------+----------+
| 18 | footer             | footer_option_one    |        0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature   | homepage_feature_one |        0 |
| 25 | homepage_feature   | homepage_feature_one |        1 |
+----+--------------------+----------------------+----------+

Marquei os grupos na listagem acima para deixar tudo claro.

Na próxima etapa, de cada grupo, o mecanismo de banco de dados produz uma única linha . Mas como?

O SELECIONAR cláusula de sua consulta é SELECT * . * representa a lista completa de colunas da tabela; neste caso, SELECT * é uma maneira curta de escrever:
SELECT id, section_identifier, option_identifier, store_id

Vamos analisar os valores da coluna id para o primeiro grupo. Qual valor o mecanismo de banco de dados deve escolher para id ? 17 ou 23 ? Por que 17 e por que 23 ?

Não tem nenhum critério para favorecer 17 acima de 23 . Ele apenas escolhe um deles (provavelmente 17 mas isso depende de muitos fatores internos) e vai um.

Não há problema em determinar o valor para section_identifier . É a coluna usada para GROUP BY , todos os seus valores em um grupo são iguais.

O dilema de escolha ocorre novamente nas colunas option_identifier e store_id .

De acordo com o padrão SQL sua consulta não é válida e não pode ser executada. No entanto, alguns mecanismos de banco de dados o executam conforme descrito acima. Os valores para expressões que não são (pelo menos um dos abaixo):
  • usado no GROUP BY cláusula;
  • usado com GROUP BY funções agregadas no SELECT cláusula;
  • funcionalmente dependente das colunas usadas no GROUP BY cláusula;

são indeterminados.

Desde a versão 5.7.5 , MySQL implementa detecção de dependência funcional e, por padrão, rejeita um GROUP BY inválido consulta como a sua.

Como fazer funcionar


Não está claro para mim como você deseja obter o conjunto de resultados. De qualquer forma, se você deseja obter algumas linhas da tabela, GROUP BY não é a maneira correta de fazer. GRUPAR POR não selecionar linhas de uma tabela, ele gera novos valores usando os valores da tabela. Uma linha gerada por GROUP BY , na maioria das vezes, não corresponde a nenhuma linha da tabela de origem.

Você pode encontrar uma possível solução para seu problema esta resposta . Você terá que escrever a consulta depois de ler e entender a ideia (e é muito claro para você como as linhas "vencedoras" devem ser selecionadas).