Foros del Web » Programando para Internet » PHP » Zend »

hacer una subcosulta con Zend_Db_Expr

Estas en el tema de hacer una subcosulta con Zend_Db_Expr en el foro de Zend en Foros del Web. He tenido un inconveniente al integrar una subconsulta a mi query. Me han indicado que una de las mejores maneras es con Zend_Db_Expr. Por el ...
  #1 (permalink)  
Antiguo 05/12/2011, 19:28
Avatar de ApipeMc  
Fecha de Ingreso: septiembre-2010
Ubicación: Medellín, Antioquia, Colombia
Mensajes: 76
Antigüedad: 14 años, 2 meses
Puntos: 1
Pregunta hacer una subcosulta con Zend_Db_Expr

He tenido un inconveniente al integrar una subconsulta a mi query.
Me han indicado que una de las mejores maneras es con Zend_Db_Expr.

Por el momento la esto es lo que tengo.
Código PHP:
$this->getAdapter()
    ->
select()
    ->
from(array('m' => 'mensaje'))                    
    ->
join(array('u' => 'usuario'), 'm.de = u.id', array('nombre'=>'nombre''apellido'=>'apellido'))
    ->
where("u.rol   = ?"0)                    
    ->
where('m.para    = ?', (int)$id)                    
    ->
group('m.de')
    ->
order('m.fecha DESC')
    ->
__toString(); 
Y esta es la consulta que necesito realizar
Código MySQL:
Ver original
  1. SELECT `m`.*, `u`.`nombre`, `u`.`apellido`
  2. FROM `mensaje` AS `m`
  3. INNER JOIN `usuario` AS `u` ON m.de = u.id
  4.         (SELECT MAX(`msj`.`fecha`) as max_time
  5.         FROM `mensaje` AS `msj`
  6.         GROUP BY `msj`.`de`)
  7. AS tmp
  8. ON m.fecha = tmp.max_time
  9. ORDER BY tmp.max_time DESC

Última edición por ApipeMc; 05/12/2011 a las 21:53
  #2 (permalink)  
Antiguo 06/12/2011, 07:44
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: hacer una subcosulta con Zend_Db_Expr

Podría ser algo así
Código PHP:
Ver original
  1. $max = $this->getAdapter()
  2.     ->select()
  3.     ->from(array('msj' => 'mensaje'), new Zend_Db_Expr('MAX(`msj`.`fecha`) as max_time'))
  4.     ->group('msj.de');
  5. echo $this->getAdapter()
  6.     ->select()
  7.     ->from(array('m' => 'mensaje'))                    
  8.     ->join(array('u' => 'usuario'), 'm.de = u.id', array('nombre'=>'nombre', 'apellido'=>'apellido'))
  9.     ->join(array('tmp' => new Zend_Db_Expr("($max)")), 'm.fecha = tmp.max_time')
  10.     ->where('u.rol = ?', 0)                    
  11.     ->where('m.para = ?', (int)$id)                    
  12.     ->group('m.de')
  13.     ->order('m.fecha DESC')
  14.     ->__toString();
Como también puedes indicar directamente la consulta en Zend_Db_Expr.
Código PHP:
Ver original
  1. echo $this->getAdapter()
  2.     ->select()
  3.     ->from(array('m' => 'mensaje'))                    
  4.     ->join(array('u' => 'usuario'), 'm.de = u.id', array('nombre'=>'nombre', 'apellido'=>'apellido'))
  5.     ->join(array('tmp' => new Zend_Db_Expr("(SELECT MAX(`msj`.`fecha`) as max_time FROM `mensaje` AS `msj` GROUP BY `msj`.`de`)")), 'm.fecha = tmp.max_time')
  6.     ->where('u.rol = ?', 0)                    
  7.     ->where('m.para = ?', (int)$id)                    
  8.     ->group('m.de')
  9.     ->order('m.fecha DESC')
  10.     ->__toString();
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 06/12/2011 a las 07:52
  #3 (permalink)  
Antiguo 06/12/2011, 07:55
Avatar de ApipeMc  
Fecha de Ingreso: septiembre-2010
Ubicación: Medellín, Antioquia, Colombia
Mensajes: 76
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: hacer una subcosulta con Zend_Db_Expr

No entiendo muy bien lo que esta en el código,
Ya que tienes un echo y un variable $max, que no veo declarado por ningún lado.
  #4 (permalink)  
Antiguo 06/12/2011, 09:11
Avatar de ApipeMc  
Fecha de Ingreso: septiembre-2010
Ubicación: Medellín, Antioquia, Colombia
Mensajes: 76
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: hacer una subcosulta con Zend_Db_Expr

Eh solucionado mi problema de la siguiente manera

Código PHP:
Ver original
  1. class Usuario_Model_DbTable_Mensaje extends Zend_Db_Table_Abstract
  2. {
  3.  
  4.     protected $_name    = 'mensaje';
  5.     protected $_primary = 'id';
  6.    
  7.     public function getlistmensaje($id){
  8.        
  9.         $select      = $this->getAdapter()
  10.                             ->select()
  11.                             ->from('mensaje',array('max_time'=>new Zend_Db_Expr('MAX(fecha)')))
  12.                             ->group('de');
  13.         $subconsulta = $select->__toString();
  14.                    
  15.         return $this->getAdapter()
  16.                     ->select()
  17.                     ->from(array('m'   => 'mensaje'))
  18.                     ->join(array('u'   => 'usuario'), 'm.de = u.id', array('nombre'=>'nombre', 'apellido'=>'apellido'))
  19.                     ->join(array('tmp' => new Zend_Db_Expr('('.$subconsulta.')')), 'm.fecha = tmp.max_time', false)
  20.                     ->where('u.rol  = ?', 0)                   
  21.                     ->where('m.para = ?', (int)$id)
  22.                     ->order('tmp.max_time DESC')
  23.                     ->query()
  24.                     ->fetchAll();
  25.     }
  26.    
  27. }

Y este es resultado que me devuelve
Código MySQL:
Ver original
  1. SELECT `m`.*, `u`.`nombre`, `u`.`apellido`
  2. FROM `mensaje` AS `m`
  3. INNER JOIN `usuario` AS `u` ON m.de = u.id
  4. INNER JOIN (SELECT MAX(fecha) AS `max_time` FROM `mensaje` GROUP BY `de`) AS `tmp`
  5. ON m.fecha = tmp.max_time
  6. WHERE (u.rol = 0)
  7. AND (m.para = 20)
  8. ORDER BY `tmp`.`max_time` DESC

Gracias por su colaboración :)

Etiquetas: db_s, expr, query
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:53.