Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

m@dDog

[Resolvido] Problema com JOIN e WHERE

Recommended Posts

Ola pessoal,

 

Presciso fazer um SELECT para trazer dados da tabela "lojas" e os endereços das lojas, da tabela "endereços"

Presciso trazer os dados da loja mesmo que ainda não haja endereços cadastrados, para isso uso LEFT JOIN. Assim o SELECT funciona.

Mas tambem é presciso usar a clausula WHERE (`Endereco`.`ativo`='S') para verificar se o endereço esta "ativo". Com esta clausula o select não traz os dados da loja a menos que haja endereço cadastrado para a loja.

Como faço para trazer os dados da loja sem que haja endereços cadastrados e mantendo a clausula WHERE `Endereco`.`ativo`='S' ?

 

 

SELECT `Loja`.`razao`,

`Loja`.`fantasia`,

`Loja`.`cep`,

`Loja`.`cnpj`,

`Cidade`.`nome`,

`Estado`.`sigla`

FROM `lojas` AS `Loja`

LEFT JOIN `enderecos` AS `Endereco` ON (`Loja`.`id` = `Endereco`.`loja_id`)

LEFT JOIN `cidades` AS `Cidade` ON (`Endereco`.`cidade_id` = `Cidade`.`id`)

LEFT JOIN `estados` AS `Estado` ON (`Estado`.`id` = `Cidade`.`estado_id`)

WHERE `Loja`.`id` = 14

AND `Endereco`.`ativo`='S'

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual é o significado de 's' no campo `Endereco`.`ativo`?

 

porque se significa sim, tudo me leva a pensar que se o endereço esta ativo então busca endereços que existem.

ou seja sem endereço provavelmente o campo `Endereco`.`ativo` vai estar com o valor 'n' que não esta na clausula where partindo desse presuposto.

 

e ai é isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso mesmo.

 

Inclusive a minha dúvida é essa:

"Como faço para trazer os dados da loja sem que haja endereços cadastrados e mantendo a clausula WHERE `Endereco`.`ativo`='S' ?"

 

qual é o significado de 's' no campo `Endereco`.`ativo`?

 

porque se significa sim, tudo me leva a pensar que se o endereço esta ativo então busca endereços que existem.

ou seja sem endereço provavelmente o campo `Endereco`.`ativo` vai estar com o valor 'n' que não esta na clausula where partindo desse presuposto.

 

e ai é isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça:

 

select * from endereco where ativo = 's'

 

select * from endereco where ativo <> 's'

 

se o segundo select retornar nulo no campo de endereço da ja da pra ver o porque que não retornou registros sem endereço.

 

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,

 

Não sei o que você está pretendendo, mas pela sua consulta, acho que sua modelagem está literalmente louca. Eu faria completamente diferente. Se cada loja tem um CNPJ diferente, eu faria apenas uma tabela com todos os dados dentro dela e sua consulta seria simplesmente uma consulta de cadastro de lojas.

 

Não entendo porque razão você modelou seu DB com uma tabela para loja, outra pra endereço, outra pra estado e outra pra cidade. Teoricamente você não tem redundância nos dados ao ter várias tabelas, mas a necessidade dos dados não seriam apenas para cadastrar?

 

Bom, mas eu faria uma única tabela. A consulta final seria muito simples como select * from lojas where ......

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas essa é a idéia.

Eu quero saber se tem como fazer o select sem que haja registros na tabela endereços.

 

"Como faço para trazer os dados da loja sem que haja endereços cadastrados e mantendo a clausula WHERE `Endereco`.`ativo`='S' ?"

 

 

 

faça:

 

select * from endereco where ativo = 's'

 

select * from endereco where ativo <> 's'

 

se o segundo select retornar nulo no campo de endereço da ja da pra ver o porque que não retornou registros sem endereço.

 

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode mudar um pouco a lógica do seu sql... algo assim:

 

SELECT `Loja`.`razao`,
`Loja`.`fantasia`,
`Loja`.`cep`,
`Loja`.`cnpj`,
`Cidade`.`nome`,
`Estado`.`sigla`
FROM `lojas` AS `Loja`
LEFT JOIN `enderecos` AS `Endereco` ON (`Loja`.`id` = `Endereco`.`loja_id` AND `Endereco`.`ativo`='S')
LEFT JOIN `cidades` AS `Cidade` ON (`Endereco`.`cidade_id` = `Cidade`.`id`)
LEFT JOIN `estados` AS `Estado` ON (`Estado`.`id` = `Cidade`.`estado_id`)
WHERE `Loja`.`id` = 14

Se retirar do where e por no left o AND `Endereco`.`ativo`='S', isso não vai obrigar o registro a ter um endereço ativo para aparecer. Agora, se estiver no where, só vai retornar se existir um endereço ativo para a loja.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

se o que você quer saber e se ha maneira te digo hoje com minhas limitações de conhecimento que não ha como fazer isso e lhe digo o porque?

 

fica claro no resultado do seu select que quem tem precedencia é o where e não o join então ele pega todos os endereco.ativo = 's' ou seja endereço valido é igual a endereço que existe, sendo assim podemos definir que o plano de execução feito foi:

 

primeiro: filtrar o que tem na where --ou seja 's' = tem obrigatóriamente endereço

ha ta e no meio desses enderesso tem algun nulo -- nulo não é esnereco ativo então não vai esta na listagem

segundo: faz o join

 

é isso que você queria saber?

 

procure saber mais sobre DDL isso ira esclarecer suas duvidas em relação a select, update e delete.

 

espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você postou logo em seguido ao meu post, portanto sua pergunta é:

 

Sua dúvida é sobre a minha idéia?

 

Se for, a query seria, select * from lojas where campoendereço='' para registros que não tenham endereço cadasrado e select * from lojas where campoendereço<>''.

 

Como sugestão você também pode deixar um valor default no campoendereço, por exemplo:

create table loja (

.

.

.

campoendereço varchar(100) not null default 'SEM ENDEREÇO',

.

.

.

index indicedocampoendereço(campoendereço)

.

.

.);

 

Nesse caso, todo registro adicionado sem endereço, automaticamente a tabela guardará a informação SEM ENDEREÇO, portanto sua query seria, select * from lojas where campoendereço='SEM ENDEREÇO' para registros que não tenham endereço cadasrado e select * from lojas where campoendereço<>'SEM ENDEREÇO'.

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Alex_poty,

se tratam de lojas, ou seja, uma mesma loja pode ter mais de um endereço, como redes de uma loja espalhadas pelo país, podendo haver lojas em qualquer estado ou cidade.

Tambem uso a tabela de cidades e estados em mais rotinas como por exemplo, clientes, ou seja, posso atrelar clientes a mesma tabela de estados e a tabela de cidades, é claro que em uma tabela de relacionamento clientes_cidades e assim por diante.

Entendeu agora?

 

A modelagem não esta louca, pense bem, você pode usar os cadastros de cidades e estados em seu sistema inteiro.

 

E a respeito de ter postado logo em seguida do teu post, era com a intenção de falar com o samirbh, assim como esta no QUOTE, logo abaixo do post.

 

Cara,

 

Não sei o que você está pretendendo, mas pela sua consulta, acho que sua modelagem está literalmente louca. Eu faria completamente diferente. Se cada loja tem um CNPJ diferente, eu faria apenas uma tabela com todos os dados dentro dela e sua consulta seria simplesmente uma consulta de cadastro de lojas.

 

Não entendo porque razão você modelou seu DB com uma tabela para loja, outra pra endereço, outra pra estado e outra pra cidade. Teoricamente você não tem redundância nos dados ao ter várias tabelas, mas a necessidade dos dados não seriam apenas para cadastrar?

 

Bom, mas eu faria uma única tabela. A consulta final seria muito simples como select * from lojas where ......

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Era isso mesmo Chrnos!

Como não pensei nisso?

http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

É muito simples.

Valew.

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Você pode mudar um pouco a lógica do seu sql... algo assim:

 

SELECT `Loja`.`razao`,
`Loja`.`fantasia`,
`Loja`.`cep`,
`Loja`.`cnpj`,
`Cidade`.`nome`,
`Estado`.`sigla`
FROM `lojas` AS `Loja`
LEFT JOIN `enderecos` AS `Endereco` ON (`Loja`.`id` = `Endereco`.`loja_id` AND `Endereco`.`ativo`='S')
LEFT JOIN `cidades` AS `Cidade` ON (`Endereco`.`cidade_id` = `Cidade`.`id`)
LEFT JOIN `estados` AS `Estado` ON (`Estado`.`id` = `Cidade`.`estado_id`)
WHERE `Loja`.`id` = 14

Se retirar do where e por no left o AND `Endereco`.`ativo`='S', isso não vai obrigar o registro a ter um endereço ativo para aparecer. Agora, se estiver no where, só vai retornar se existir um endereço ativo para a loja.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.