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 BYcláusula; - usado com
GROUP BY funções agregadasnoSELECTcláusula; - funcionalmente dependente das colunas usadas no
GROUP BYclá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).