Regex 0 Denunciar post Postado Julho 25, 2008 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
cassitos 2 Denunciar post Postado Julho 25, 2008 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
Regex 0 Denunciar post Postado Julho 30, 2008 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
cassitos 2 Denunciar post Postado Julho 30, 2008 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
Regex 0 Denunciar post Postado Agosto 1, 2008 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
cassitos 2 Denunciar post Postado Agosto 1, 2008 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_ide 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
cassitos 2 Denunciar post Postado Agosto 1, 2008 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=latin1rodei 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 padraonã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
Regex 0 Denunciar post Postado Agosto 2, 2008 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
Regex 0 Denunciar post Postado Agosto 2, 2008 [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
cassitos 2 Denunciar post Postado Agosto 2, 2008 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
Regex 0 Denunciar post Postado Agosto 2, 2008 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
cassitos 2 Denunciar post Postado Agosto 2, 2008 ^_^ beleza! ehehe http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites