Ir para conteúdo

POWERED BY:

Arquivado

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

GOri

innerjoin no zend

Recommended Posts

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

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

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

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

 

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

×

Informação importante

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