Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Código diferente da resposta e funciona.

select sum(valor), nome
from compras join compradores on
compras.comprador_id = compradores.id group by nome;

Reparei que o MySQL localizou a coluna nomes mesmo sem passar o nome qualificado compradores.nome.

Por que isso ocorre?

5 respostas

Gabriel não entendi sua dúvida, poderia explicar um pouco melhor por favor ?

Gabriel, bom dia. Tudo bem?

A coluna nome foi exibida porque você solicita aqui:

select sum(valor), nome

você traz a soma dos valores, e a coluna nomes onde há o relacionamento.

Tranquilo? caso não seja isso, me desculpe e refaça a pergunta.

abraços.

Creio que entendi a dúvida do colega.

Na hora de vincular as tabelas, está sendo colocado primeiro o nome da tabela, depois um ponto e o nome do campo que se deseja utilizar (exemplo: compras.comprador_id).

Porem, na hora de listar, ou na hora de se aplicar a ordenação, esse formato não é utilizado, o nome do campo é usado direto sem fazer referência primeiro a tabela.

Eu não vi a estrutura das tabelas, mas, se não deu problema, é porque o campo nome existe apenas em 1 das tabelas utilizadas no join. Se houvesse um campo nome nas duas tabelas, não funcionaria, porque o mecanismo de banco de dados não saberia de qual tabela o campo nome deve ser retornado.

Para evitar esse problema pode ser usado o formato tabela.nome_do_campo. Uma forma diferente de fazer a mesma coisa seria usar um Alias, ou seja, dar um apelido para a tabela. Um exemplo:

select sum(B.valor) as total, A.nome from compras as A join compradores as B on B.comprador_id = A.id group by A.nome;

Boa Daniel, em todas minhas SQL's onde tem amarração de tabelas eu utilizo alias.

solução!

Bom, eu não li nenhuma resposta anterior, mas vou explicar:

repare que a tabela compras e compradores não possuem campos iguais, a não ser o campo ìd. Então não há a necessidade de especificar o campo nome para a tabela compradores, sendo que na tabela compras não possui o campo nome.

Vou dar um outro exemplo de código, este que usei:

select nome, sum(valor) as soma from 
compras join compradores on 
compras.id_comprador = compradores.id 
group by nome;

Se, por acaso, eu não definir o id para a tabela compradores, aparece um erro de ambiguidade:

ERROR 1052 (23000): Column 'id' in on clause is ambiguous

Espero ter esclarecido a tua duvida =)