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
noSELECT
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).