GOri 0 Denunciar post Postado Setembro 24, 2009 Olá Pessoal! Eu sou iniciante (iniciante mesmo) no zend, e estou com uma dúvida! como fazer o innerjoin no zend com uma instrução sql expecífica! TO bem na dúvida mesmo! Pois eu to tentando transformar um sisteminha em zend para aprendizado e estou me matando! Procurei muito na net e não achei nada semelhante a minha duvida. Vcs podem me ajudar? A instrução é essa abaixo $sql = "SELECT u.id, u.ip, u.last_hit, u.origin, u.domain, (SELECT COUNT(*) FROM user_hits WHERE user_hits.user_id = u.id) AS hits, (SELECT name FROM os WHERE os.id = u.os_id) AS os, (SELECT name FROM browser WHERE browser.id = u.browser_id) AS browser FROM users AS u ORDER BY u.last_hit DESC LIMIT $amount"; Eu tava tentando da seguinte maneira $select = $this->getAdapter()->select(); $select->from('users', '*') ->join(array('algumakey'=>'algumvalor', array() ) ->limit($amout); Sinceramente meu muito obrigado a todos Gerson Compartilhar este post Link para o post Compartilhar em outros sites
GOri 0 Denunciar post Postado Setembro 24, 2009 Poxa vida! Ninguem pode me ajudar? Eu tentei de todo o jeito mas não to entendendo esses select dentro do select, count etc! Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 24, 2009 Olha, dá uma olhada neste link. Explica como fazer subquery. http://framework.zend.com/issues/browse/ZF-1328;jsessionid=FA39AB2D60F0C8FF35679229CD991448?page=com.atlassian.jira.ext.fisheye:fisheye-issuepanel Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
GOri 0 Denunciar post Postado Setembro 24, 2009 Grande Matias! Sempre tentando sanar minhas dúvidas! Até que deu uma luz isso.. mas na hora de montar não deu certo Pelo que eu entendi o "Zend_Db_Expr" é que faz a subquery.. mas esse exemplo do sql que eu dei ta cabeludo demais! Tem 3 selects dentro do select pai digamos assim! Deve ser até facil (não pra mim), mas sabe quando você se mata em cima de algo e não acha solução! Ta desse jeito! hehehe Eu to tentando fazer assim $select->from(array('u'=>'users'), array('u.id', 'u.ip', 'u.last_hit', 'u.origin', 'u.domain')) ->joinInner( array( 'temp' => new Zend_Db_Expr('(' . $select->from('userhits',array('COUNT(*)')) ->where('userhits.users_id = ?', 'u.id') . ')') ), 'project_file.id = temp.id', array() ); Mas está dando erro Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id' cannot be null Não consigo evoluir! Compartilhar este post Link para o post Compartilhar em outros sites
GOri 0 Denunciar post Postado Setembro 24, 2009 Eu acho que viajei! Essa instrução sql nem tem innerjoin eu me enganei pelo tamanho dela. Mas mesmo assim ta dando erro de sintaxe sql! Alguem sabe que erro é? Mas pelo jeito eu to chegando perto! Grato Bom, o erro que retorna é esse Message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.`users` AS `u` WHERE (h.users_id = 'u.id') AND (o.id = 'u.os_id') LIMIT' at line 3 e o meu codigo é este $select = $this->getAdapter()->select(); $select->from(array('u'=>'users'), array('u.id', 'u.ip', 'u.last_hit', 'u.origin', 'u.domain'), array( 'hits' => new Zend_Db_Expr('(' . $select->from(array('h'=>'userhits'),array('COUNT(*)')) ->where('h.users_id = ?', 'u.id') . ')') ), array( 'os' => new Zend_Db_Expr('(' . $select->from(array('o'=>'os',array('o.name'))) ->where('o.id = ?','u.os_id') . ')') ), array('u.id' => 'hits.id','u.os_id'=>'os.id'), array() ) ->limit($amout); Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 24, 2009 Cara, não adianta ficar falando 'Poxa vida... ninguém??'. As pessoas não vão te ajudar mais rápido por isto, além de ser contra as regras do fórum. Regras do Fórum Outra coisa, eu achei a tua query bem gambiarrenta... Este monte de subquery tá estranho... é melhor usar JOIN pra isto... De qualquer forma, tenta assim... $select = $this->getAdapter()->select(); $select->from(array('u'=>'users'), array('u.id', 'u.ip', 'u.last_hit', 'u.origin', 'u.domain'), array( 'hits' => $select->from(array('h'=>'userhits'),array('COUNT(*)')) ->where('h.users_id = ?', 'u.id') ), array( 'os' => $select->from(array('o'=>'os',array('o.name'))) ->where('o.id = ?','u.os_id') ), array('u.id' => 'hits.id','u.os_id'=>'os.id'), array() ) ->limit($amout); Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
GOri 0 Denunciar post Postado Setembro 24, 2009 Poxa cara! você uma pessoa tão prestativa, parece-me ser super gente fina, pra que ficar extressado parceiro! Tudo certo! Eu errei realmente, mas cara, na boa, espero que você não leve pro lado pessoal! Mas se realmente todos os foruns fossem perfeitos não precisaria de moderadores não é mesmo! Desculpe pelo erro, prometo que não acontecerá mais. No entanto você falou sobre a "gambiarra". Esse código não é meu, eu estou tentando aprender zend em cima dele para dominar "boas práticas de programação", sou iniciante sim! Mas o intuito de um forum de TI é pra que? Ensinar? Ajudar nas dúvidas? Instruir a pessoa sobre o que é gambiarra e o que não é e como resolver sem o uso do mesmo? Sei lá.. no meu modo de pensar, eu acho que se é gambiarra, você que é um programador experiente deveria dar uma ideia de como se fazer sem o uso delas(gambiarras), não dar tudo mastigado, mas dar uma ideia! Porque eu não sei se sou do nivel que você esperava ajudar! Mas, se você... como eu imagino aprendeu um dia programação e não nasceu sabendo, deve inclusive ter feito gambiarras por não dominar a ferramenta ou teve dúvidas como as minhas, e correu atrás para sanar suas dúvidas e até ficou muito ansioso por uma resposta de alguem experiente assim como eu fiquei! Espero que realmente não leve pro lado pessoal, pois ainda te considero um cara gente fina e muito prestativo. Foi meu ponto de vista em relação a esta questão apenas. Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 24, 2009 Mas se realmente todos os foruns fossem perfeitos não precisaria de moderadores não é mesmo! Desculpe pelo erro, prometo que não acontecerá mais. Uma das funções do moderador é justamente zelar para que as regras sejam cumpridas, que foi exatamente o que eu fiz, ao lhe advertir sobre uma regra que você descumpriu. deveria dar uma ideia de como se fazer sem o uso delas(gambiarras) Eu dei a idéia. é melhor usar JOIN pra isto... deve inclusive ter feito gambiarras por não dominar a ferramenta Até hoje ainda faço algumas gambiarras. Aprendi muito no fórum, e continuo aprendendo até hoje. Inclusive, nunca usei subquery no ZF, mas quando vi a sua dúvida, resolvi procurar e achei aquele post. Em resumo, se você se sentiu ofendido pelas minhas palavras, peço desculpas. Não era a minha intenção. Agora, sobre o código, tentou da forma que eu falei? Porque eu não testei, mas pelo que eu entendi do link que eu te passei, a sintaxe correta do comando é esta. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
GOri 0 Denunciar post Postado Setembro 24, 2009 Realmente Carlos! você tem toda a razão! O moderador tem que zelar mesmo! Como eu disse eu errei, peço desculpas e não acontecerá mais! Eu também aprendi muito aqui, por este motivo sei o quão prestativo você é! Por isso mais uma vez agradeço, o problema é que eu nem sabia que o nome disso era subquery. Não me senti ofendido não.. de forma alguma! Nem precisa pedir desculpas! Isso foi um digamos "desentendimento" sadio. Eu fiz sim... mas infelizmente não deu certo.. ele interrompe a conexão A conexão para o servidor foi reiniciada durante o carregamento da página. Pois é.. eu tentei também com join, mas ele retorna errado, ele retorna 1 resultado do loop (seriam 2) e no hits que é a contagem de itens da outra tabela concatenada ao id da primeira ele resulta em 233 sendo que seria apenas 60. Tentei de uma outra maneira, seguindo suas dicas e ele me retorna em branco! Sem o uso do join Vou continuar tentando! Mas antecipadamente já deixo meu agradecimento Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Setembro 24, 2009 Tá... como você fez o JOIN? Carlos Eduardo? Compartilhar este post Link para o post Compartilhar em outros sites
GOri 0 Denunciar post Postado Setembro 24, 2009 Seu nome é Matias Rezende ou Carlos Eduardo? Eu fiz assim, só para verificar os hits primeiro, depois eu faria pro sistema operacional e navegadores $select->from(array('u'=>'users'), array('u.id', 'u.ip', 'u.last_hit', 'u.origin', 'u.domain'), null, array()) ->join(array('h'=>'userhits'), 'u.id = h.users_id', array('COUNT(*) AS hits'), array()); Compartilhar este post Link para o post Compartilhar em outros sites
Mário Monteiro 179 Denunciar post Postado Setembro 29, 2009 Seu nome é Matias Rezende ou Carlos Eduardo? Acredito ser os dois Carlos Eduardo Matias Rezende Compartilhar este post Link para o post Compartilhar em outros sites