Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
É 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?
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.
...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...
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.
...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
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.
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...
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...
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
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.ativovai estar com o valor 'n' que não esta na clausula where partindo desse presuposto.e ai é isso mesmo?