Difficulty in returning the result in a query without duplicating

2

I am trying to set up a query (MYSQL) to return all the clients that a particular vendor can view. The rules for showing the list of customers for this seller are: - Clients with overdue contracts or without contracts. - Customers with bids or no proposals. - Clients with current contracts or proposals still valid as long as these have been created by the vendor conducting the consultation.

In short: I can only show customers available for this seller.

My scenario in the database is:

Icameupwiththefollowingquerybutitisreturningduplicateclients.Theproblemisthatacustomermayhavebeenservedbymorethanonevendor,thatis,anunsuccessfulbidfromseller1andavalidcontractfromseller2,inthiscaseifseller2doesthesearch,thatcustomerappearstwiceintheresult,becausetheGroupByclausehasincludedboththeseller-relatedrecordofthe"Proposal" table and the record linked to the seller of the "Contract" table. / p>

See the query:

    select DISTINCT  'clientes'.'id', 'clientes'.'pessoa_tipo', 'clientes'.'razao_nome', 'clientes'.'nome_fantasia', 'clientes'.'email', 'clientes'.'logradouro', 'clientes'.'numero', 'clientes'.'complemento', 'clientes'.'bairro', 'clientes'.'cidade', 'clientes'.'uf', 'clientes'.'cep', 'clientes'.'telefone', 'clientes'.'celular', 'clientes'.'cnpj_cpf', 'clientes'.'inscricao_rg', 'clientes'.'contato_nome', 'clientes'.'contato_funcao', 'clientes'.'representante_nome', 'clientes'.'representante_rg', 'clientes'.'representante_cpf', 'clientes'.'atividade_rf', 'clientes'.'atividades_comerciais_id', 'contratos'.'vendedores_id' as 'contrato_vendedor', 'propostas'.'vendedores_id' as 'proposta_vendedor'
from 'clientes' left join 'contratos' on 'contratos'.'clientes_id' = 'clientes'.'id' left join 'propostas' on 'propostas'.'clientes_id' = 'clientes'.'id' 
group by 'clientes'.'id', 'clientes'.'pessoa_tipo', 'clientes'.'razao_nome', 'clientes'.'nome_fantasia', 'clientes'.'email', 'clientes'.'logradouro', 'clientes'.'numero', 'clientes'.'complemento', 'clientes'.'bairro', 'clientes'.'cidade', 'clientes'.'uf', 'clientes'.'cep', 'clientes'.'telefone', 'clientes'.'celular', 'clientes'.'cnpj_cpf', 'clientes'.'inscricao_rg', 'clientes'.'contato_nome', 'clientes'.'contato_funcao', 'clientes'.'representante_nome', 'clientes'.'representante_rg', 'clientes'.'representante_cpf', 'clientes'.'atividade_rf', 'clientes'.'atividades_comerciais_id', 'contratos'.'vendedores_id', 'propostas'.'vendedores_id' 
having (Max(contratos.vigencia_final) IS NULL AND Max(contratos.vigencia_final) IS NULL)
OR
(Max(contratos.vigencia_final) <= '2017-11-23' AND Max(propostas.validade) <= '2017-11-23')
OR
(Max(contratos.vigencia_final) <= '2017-11-23' AND Max(propostas.validade) IS NULL)
OR
(Max(propostas.validade) <= '2017-11-23' AND Max(contratos.vigencia_final) IS NULL)
OR
(contratos.vendedores_id = '3' OR propostas.vendedores_id = '3')

    
asked by anonymous 24.10.2017 / 15:17

2 answers

0

You have to put some aggregating function for these columns such as SUM () and get them out of group by, or simply take those columns out of your query, it depends on what information you need that column to return.     

24.10.2017 / 15:30
0

You can remove these columns from group by and use Max (suacoluna) or Min (suacoluna).

Something like this.

select DISTINCT  'clientes'.'id', 'clientes'.'pessoa_tipo', 'clientes'.'razao_nome', 'clientes'.'nome_fantasia', 'clientes'.'email', 'clientes'.'logradouro', 'clientes'.'numero', 'clientes'.'complemento', 'clientes'.'bairro', 'clientes'.'cidade', 'clientes'.'uf', 'clientes'.'cep', 'clientes'.'telefone', 'clientes'.'celular', 'clientes'.'cnpj_cpf', 'clientes'.'inscricao_rg', 'clientes'.'contato_nome', 'clientes'.'contato_funcao', 'clientes'.'representante_nome', 'clientes'.'representante_rg', 'clientes'.'representante_cpf', 'clientes'.'atividade_rf', 'clientes'.'atividades_comerciais_id', 

Max('contratos'.'vendedores_id') as'contrato_vendedor', 

Max('propostas'.'vendedores_id') as 'proposta_vendedor'

from 'clientes' 
left join 'contratos' 
on 'contratos'.'clientes_id' = 'clientes'.'id' 
left join 'propostas' 
on 'propostas'.'clientes_id' = 'clientes'.'id' 
group by 'clientes'.'id', 'clientes'.'pessoa_tipo', 'clientes'.'razao_nome', 'clientes'.'nome_fantasia', 'clientes'.'email', 'clientes'.'logradouro', 'clientes'.'numero', 'clientes'.'complemento', 'clientes'.'bairro', 'clientes'.'cidade', 'clientes'.'uf', 'clientes'.'cep', 'clientes'.'telefone', 'clientes'.'celular', 'clientes'.'cnpj_cpf', 'clientes'.'inscricao_rg', 'clientes'.'contato_nome', 'clientes'.'contato_funcao', 'clientes'.'representante_nome', 'clientes'.'representante_rg', 'clientes'.'representante_cpf', 'clientes'.'atividade_rf', 'clientes'.'atividades_comerciais_id'
having (Max(contratos.vigencia_final) IS NULL AND Max(contratos.vigencia_final) IS NULL)
OR
(Max(contratos.vigencia_final) <= '2017-11-23' AND Max(propostas.validade) <= '2017-11-23')
OR
(Max(contratos.vigencia_final) <= '2017-11-23' AND Max(propostas.validade) IS NULL)
OR
(Max(propostas.validade) <= '2017-11-23' AND Max(contratos.vigencia_final) IS NULL)
OR
(contratos.vendedores_id = '3' OR propostas.vendedores_id = '3')

Or as mentioned in the comments.

select * from
(
    select DISTINCT  'clientes'.'id', 'clientes'.'pessoa_tipo', 'clientes'.'razao_nome', 'clientes'.'nome_fantasia', 
        'clientes'.'email', 'clientes'.'logradouro', 'clientes'.'numero', 'clientes'.'complemento', 'clientes'.'bairro', 
        'clientes'.'cidade', 'clientes'.'uf', 'clientes'.'cep', 'clientes'.'telefone', 'clientes'.'celular', 'clientes'.'cnpj_cpf', 
        'clientes'.'inscricao_rg', 'clientes'.'contato_nome', 'clientes'.'contato_funcao', 'clientes'.'representante_nome', 
        'clientes'.'representante_rg', 'clientes'.'representante_cpf', 'clientes'.'atividade_rf', 'clientes'.'atividades_comerciais_id', 
        'contratos'.'vendedores_id' as'contrato_vendedor', 'propostas'.'vendedores_id' as 'proposta_vendedor'
    from 'clientes' 
    left join 'contratos' 
        on 'contratos'.'clientes_id' = 'clientes'.'id' 
    left join 'propostas' 
        on 'propostas'.'clientes_id' = 'clientes'.'id' 
    group by 'clientes'.'id', 'clientes'.'pessoa_tipo', 'clientes'.'razao_nome', 'clientes'.'nome_fantasia', 
        'clientes'.'email', 'clientes'.'logradouro', 'clientes'.'numero', 'clientes'.'complemento', 'clientes'.'bairro', 
        'clientes'.'cidade', 'clientes'.'uf', 'clientes'.'cep', 'clientes'.'telefone', 'clientes'.'celular', 'clientes'.'cnpj_cpf', 
        'clientes'.'inscricao_rg', 'clientes'.'contato_nome', 'clientes'.'contato_funcao', 'clientes'.'representante_nome', 
        'clientes'.'representante_rg', 'clientes'.'representante_cpf', 'clientes'.'atividade_rf', 'clientes'.'atividades_comerciais_id',
        'contratos'.'vendedores_id', 'propostas'.'vendedores_id'
    having (Max(contratos.vigencia_final) IS NULL AND Max(contratos.vigencia_final) IS NULL)
    OR
    (Max(contratos.vigencia_final) <= '2017-11-23' AND Max(propostas.validade) <= '2017-11-23')
    OR
    (Max(contratos.vigencia_final) <= '2017-11-23' AND Max(propostas.validade) IS NULL)
    OR
    (Max(propostas.validade) <= '2017-11-23' AND Max(contratos.vigencia_final) IS NULL)
)
where contratos.vendedores_id = '3' 
OR propostas.vendedores_id = '3'

Then you have to see what result you expect or need.

    
24.10.2017 / 15:28