Comentário longo aqui;
Sim, você não pode fazer isso. Pense nisso... Se você tem uma tabela assim:
Col1 Col2 Col3
A A 1
B A 2
C A 3
E você está agrupando apenas por
Col2
, que agrupará em uma única linha... o que acontece com Col1
e Col3
? Ambos têm 3 valores de linha distintos. Como seu DBMS deve exibi-los? Col1 Col2 Col3
A? A 1?
B? 2?
C? 3?
É por isso que você precisa agrupar por todas as colunas ou agregá-las ou concatená-las. (
SUM()
,MAX()
, MIN()
, etc.) Mostre-nos como você deseja que os resultados sejam e tenho certeza de que podemos ajudá-lo.
Editar - Resposta:
Primeiramente, obrigado por atualizar sua pergunta. Sua consulta não tem
id
mas seus resultados esperados sim, então responderei por cada um separadamente. Sem
id
Você ainda precisará agrupar por todas as colunas para alcançar o que deseja. Vamos percorrê-lo.
Se você executar sua consulta sem nenhum grupo por:
select col1, col2, col3 from table where col3='200'
Você receberá isso de volta:
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| 1 | some text 1 | 200 |
+----------+-------------+-------+
Então agora você quer ver apenas o
col1 = 1
remar uma vez. Mas para fazer isso, você precisa rolar todos das colunas para cima, para que seu SGBD saiba o que fazer com cada uma delas. Se você tentar agrupar apenas por col1
, seu DBMS passará por um erro porque você não disse o que fazer com os dados extras em col2
e col3
:select col1, col2, col3 from table where col3='200' group by col1 --Errors
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| ? | some text 1?| 200? |
+----------+-------------+-------+
Se você agrupar por todos os 3, seu DBMS saberá agrupar as linhas inteiras (que é o que você deseja) e exibirá as linhas duplicadas apenas uma vez:
select col1, col2, col3 from table where col3='200' group by col1, col2, col3
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 | --Desired results
| 5 | some text 1 | 200 |
+----------+-------------+-------+
Com
id
Se você quiser ver
id
, você terá que informar ao seu DBMS qual id
mostrar. Mesmo se agruparmos por todas as colunas, você não obterá os resultados desejados, porque o id
coluna tornará cada linha distinta (eles não serão mais agrupados):select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 | --id = 2
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 | --id = 8
+--------+----------+-------------+-------+
Portanto, para agrupar essas linhas, precisamos dizer explicitamente o que fazer com o
id
s. Com base nos resultados desejados, você deseja escolher id = 2
, que é o mínimo id
, então vamos usar MIN()
:select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by
Que retorna os resultados desejados (com
id
):+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
+--------+----------+-------------+-------+
Pensamento final
Aqui estavam suas duas linhas de problemas:
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 |
+--------+----------+-------------+-------+
Sempre que você acertar isso, pense no que deseja que cada coluna faça, uma de cada vez. Você precisará lidar com todos colunas sempre que você fizer agrupamentos ou agregações.
id
, você só quer verid = 2
, que é oMIN()
co1
, você só quer ver valores distintos, entãoGROUP BY
col2
, você só quer ver valores distintos, entãoGROUP BY
col3
, você só quer ver valores distintos, entãoGROUP BY