Ir para conteúdo

POWERED BY:

Arquivado

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

Regex

Default value para LEFT JOIN

Recommended Posts

Olá amigos!

 

Vou tentar ser o mais objetivo possível!

 

Criei um SELECT para selecionar os produtos e suas respectivas fotos (ambos em tabelas diferentes). Preciso que a consulta retorne até mesmo os produtos que não tenham fotos, para tal usei um LEFT JOIN. Vejam:

 

SELECT * FROM produtos LEFT JOIN fotos ON fotos_refer = produto_id WHERE produto_ativo = '1'

O fato é que preciso colocar uma imagem padrão para produtos que não tenham fotos cadastradas ainda, até então tenho usado estruturas de controle do PHP para controlar isto, mas o que acontece é que é muito trabalhoso implementar isto em todas as páginas em que os produtos aparecem. Exemplo:

 

se (tem foto){

mostra foto

}senão{

mostra imagempadrão.jpg

}

Assim minha dúvida é: existe alguma forma, via MySQL, de criar um valor default para a imagem apenas para o caso de não houver uma correspondência entre os produtos e as fotos? Ou seja, existir o produto e não a foto?

 

Grato por qualquer ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

oi.

tenta executar esta consulta e veja se é o que precisa, claro que tem de adaptar para a sua necessidade:

SELECT produtos.* ,fotos.*,IF(fotos_refer IS NULL,'valor padrao',fotos_refer) AS TESTE

FROM produtos

LEFT JOIN fotos ON fotos_refer = produto_id

WHERE produto_ativo = '1'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Cassitos!

 

Acredito que o caminho é por aí mesmo! Está quase!

 

O que acontece é que não sei como implementar esta condicional na minha query... Dá erros de sintaxe!

Da forma como fiz abaixo, ele lê as fotos quando elas existem, mas dá um erro de leitura quando as mesmas não existem... Poderia verificar esta sintaxe para mim?

"SELECT *, IF (fotos_refer IS NULL, 'logo.jpg', fotos_url) as teste FROM produtos LEFT JOIN fotos ON fotos_refer = produto_id  WHERE produto_id = %s AND fotos_midia = 'produtos' "

 

Obs.: '%s' é uma sprintf do php....

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá,

 

este %s tem que estar entre apóstrofos, assim '%s'.

 

e se não me engano, para utilizar deste jeito, o interessante é fazer com LIKE em vez do sinal de igual, assim:

WHERE produto_id LIKE '%s'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cassitos,

 

Não posso usar o LIKE porque esta query é a que seleciona produtos a serem editados pelo ID, ou seja, busca uma chave primária! E o '%s' é da função sprintf do PHP, que já recebe a variável 'tratada'.. Veja um bloco maior de código:

 

 

$colname_edita = "-1";
if (isset($_GET['id'])) {
  $colname_edita = $_GET['id'];
}
mysql_select_db($database_site, $site);
$query_edita = sprintf("SELECT *, IF (fotos_refer IS NULL, 'logo.jpg', fotos_url) as teste FROM produtos LEFT JOIN fotos ON fotos_refer = produto_id  WHERE produto_id = %s AND fotos_midia = 'produtos'  ", GetSQLValueString($colname_edita, "int"));

 

Da forma como está acima não dá erros de sintaxe, mas a lógica não está certa, visto que ele não está colocando o valor default para imagens..

 

Alguma idéia?

 

Grato

 

 

 

 

 

 

olá,

 

este %s tem que estar entre apóstrofos, assim '%s'.

 

e se não me engano, para utilizar deste jeito, o interessante é fazer com LIKE em vez do sinal de igual, assim:

WHERE produto_id LIKE '%s'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha... não sei nada de Php.

 

Eu só montei algumas tabelas e fiz o teste com o left join do jeito que te passei (que pelo menos aqui funcionou), você testou a consulta direto no banco de dados sem ser via página php, tipo:

SELECT *, IF (fotos_refer IS NULL, 'logo.jpg', fotos_url) as teste FROM produtos LEFT JOIN fotos ON fotos_refer = produto_id

e ver se o campo teste está com o valor que deveria?

 

faltou eu perguntar uma coisa: o campo está nulo (NULL) ou só está vazio no banco? pq tem diferença entre estas duas situações.

 

você pode tentar mudar para ficar assim:

IF (fotos_refer IS NULL OR TRIM(fotos_refer) = '' , 'logo.jpg', fotos_url) as teste

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummmm se bem que este campo é o que está ligando as tabelas...

 

se puder...

 

posta ae a estrutura destas duas tabelas (create table).

e alguns registros que deveriam estar vindo com o default e não estão, daí ficar melhor de analisar onde está realmente o problema.

 

e também um valor desta variável que está 'tratada'.

 

eu criei duas tabelas aqui p/ simular:

CREATE TABLE `produtos` (						
			`produto_id` int(11) NOT NULL AUTO_INCREMENT,  
			`texto` varchar(50) DEFAULT NULL,			  
			`produto_ativo` varchar(1) DEFAULT '1',		
			PRIMARY KEY (`produto_id`)					 
		  ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `fotos` (				  
		  `fotos_refer` int(11) DEFAULT NULL,   
		  `endereco` varchar(50) DEFAULT NULL   
		) ENGINE=InnoDB DEFAULT CHARSET=latin1
rodei esta consulta no SqlYog (um client que uso para executar consultas e outras coisas):

SELECT produtos.* ,fotos.*,IF(fotos_refer IS NULL,'valor padrao',endereco) AS TESTE
FROM produtos 
LEFT JOIN fotos ON fotos_refer = produto_id 
WHERE produto_ativo = '1'

e o resultado foi este:

produto_id 	texto 	produto_ativo fotos_refer 	endereco 	TESTE 
1 		A 	1 	1 	AAAAA 	AAAAA 
2 		B 	1 	(NULL) 	(NULL) 	valor padrao 
3 		C 	1 	(NULL) 	(NULL) 	valor padrao 
4 		D 	1 	(NULL) 	(NULL) 	valor padrao 
5 		E 	1 	(NULL) 	(NULL) 	valor padrao 
6 		F 	1 	(NULL) 	(NULL) 	valor padrao
não está alinhado, mas só conferir a ordem dos campos.

 

e os valores das tabelas são:

produtos

produto_id texto produto_ativo 
1 	A 	1 
2 	B 	1 
3 	C 	1 
4 	D 	1 
5 	E 	1 
6 	F 	1

fotos

fotos_refer endereco 
1 	AAAAA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grato pela atenção cassitos!

 

Seu último raciocínio está correto, porém acontece o seguinte:

 

Minha tabela fotos é uma tabela que controla todas as fotos do site, isso inclui as fotos de produtos, das lojas, dos artigos, e tudo mais. Como faço o controle? É através do campo fotos_midia. Quando cadastro fotos de produtos, a tabela fica assim por exemplo:

 

fotos_id: 5
fotos_midia: produtos
fotos_refer: 15 (seria o ID do produto...)
fotos_url: pendrive.jpg
fotos......
Fotos de matérias ficam:

 

fotos_id: 6
fotos_midia: materias
fotos_refer: 15 (seria o ID da materia...)
fotos_url: lula.jpg
fotos......

 

Percebeu que existem campos fotos_refer (chave estrangeira) iguais?

Assim, eu preciso colocar o WHERE nesta condição IF que você me deu, para que selecionem apenas daquela determinada mídia! É por isso que o valor NULL não está sendo lido acredito eu..... Este é o meu problema atual.

 

Teria que ser algo assim:

 

"SELECT * FROM produtos LEFT JOIN fotos ON fotos_refer = produto_id  WHERE produto_id = %s AND fotos_midia = 'produtos' IF (fotos_refer

Compartilhar este post


Link para o post
Compartilhar em outros sites

[OPs faltou um pedaço da msg:]

 

Teria que ser algo assim:

 

"SELECT * FROM produtos LEFT JOIN fotos ON fotos_refer = produto_id  WHERE produto_id = %s AND fotos_midia = 'produtos' IF (fotos_refer IS NULL, 'logo.jpg', fotos_url) as teste "

Porém isto retorna um erro de sintaxe, visto que "IF" deve ser colocado após a vírgula do SELECT....

 

A questão é: como implementar o IF dentro da SELECT que já possuo? Isto resolveria o problema acredito...

 

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

vejamos...

podem ter ID's iguais, e o que diferencia é o fotos_midia (que está na tabela 'fotos').

então quando aquele produto não tem registro para aquela mídia NÃO está vindo registro certo?

mesmo que ele tenha registro para outra mídia...

 

hummmm :wacko:

 

certo, faz o seguinte:

aquela sua condição para o fotos_midia, tira do WHERE e põe no ON, tipo assim:

SELECT produtos.* ,fotos.*,IF(fotos_refer IS NULL,'valor padrao',endereco) AS TESTE

FROM produtos

LEFT JOIN fotos ON fotos_refer = produto_id and

fotos_midia = 'produtos'

WHERE produto_ativo = '1'

se pôr a condição no WHERE ele não está retornando os registros que não tenham referência no 'fotos'. Acontece que esta condição está associada a tabela 'fotos' (campo fotos_midia), e por este motivo o mysql está verificando nos registros que retornaram, a existência desta informação.

 

agora se incluir esta condição referente a tabela 'fotos' no ON do LEFT JOIN, ele vai verificar na tabela em questão os registros que atendem ao filtro, e como está usando o LEFT, também virão os registros que não atendem.

 

acho que enrolei mais do que expliquei, mas é por aí... ehehehe

 

fiz uns testes aqui com o que disse, e realmente os registros que não tinham referência não estavam retornando, colocanco no ON passaram a retornar (NULL).

 

sua query ficaria tipo assim:

"SELECT *,IF (fotos_refer IS NULL, 'logo.jpg', fotos_url) as teste

FROM produtos

LEFT JOIN fotos ON fotos_refer = produto_id AND fotos_midia = 'produtos'

WHERE produto_id = %s "

Compartilhar este post


Link para o post
Compartilhar em outros sites

BINGO! haha

 

Ótimo raciocínio, era isto mesmo! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Eu sempre achei que estas condicionais eram lidas de forma 'separada', assim tendo que repetir as instruções do select dentro delas. Vivendo e aprendendo.. hehe

 

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

 

Abraço

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.