Me da la impresion que si usaras DISTINCT(membresia.socio_id) tendrias un listado de las membresias que no te repiten al mismo socio, y asi podrias ordenarlas como quisieras. Sin utilizar el GROUP BY. O podrias poner alguna condicion para el GROUP BY con HAVING aunque no se me ocurre que podria ser..
Suerte!!. On Dec 5, 10:39 am, fractalix <[EMAIL PROTECTED]> wrote: > Hola. > > Estuve intentando hacer la consultas a con $this->query(), pero no > obtengo los resultados tal y como los quiero. Tengo las bases de datos > así: > > socios > +----------------+---------------------+- > | id | int(10) unsigned > | nombre | varchar(30) > | aPat | varchar(30) > | aMat | varchar(30) > | pais | varchar(30) > | estado | varchar(30) > | direccion | varchar(255) > | telefono | varchar(12) > | email | varchar(128) > +----------------+------------------- > > membresias > +---------------+---------------------+ > | id | int(10) unsigned > | socio_id | int(10) unsigned > | anio | varchar(5) > | fecha_pago | date > | recibo | varchar(10) > +----------------+------------------- > > El problema es que necesito sacar la lista de socios y su membresía > más reciente, y esta información se pone en pantalla y se debe poder > ordenar por los diversos campos antes de crear el csv. Intenté obtener > la lista de socios y de ahí crear un array con su membresía más > reciente (que si pude), pero quisiera encontrar el modo de reordenar > esa información sin estar procesando cada ocasión lo mismo (el uso del > procesador sube mucho en ese paso). > > Lo hago más o menos así: > > $this->Socio->findAll(); > > $vigentes = array(); > $vencidos = array(); > > $i = $j = 0; > foreach ($socios as $socio) { > $renglon = array('nombre' => $socio['Socio']['nombre'].' '. > $socio['Socio']['aPat'].' '.$socio['Socio']['aMat'], > 'email' => $socio['Socio']['email']); > $m1 = $m2 = array('', '', ''); > foreach ($socio['Membresia'] as $membresia) { > // encontramos la más reciente > $m1 = array($membresia['id'], $membresia['anio'], > $membresia['fecha_pago']); > if ($m2[1] > $m1[1]) { > $datos = $m2; > } else { > $m2 = $m1; > $datos = $m1; > } > } > $caducidad = strtotime($datos[2]) + (365 * 24 * 60 * 60); // > membresia anual > if ($caducidad - time() > 0) { > $vigentes = $vigentes + array($i => array_merge($renglon, > array('membresia' => $datos[0], 'anio' => $datos[1], 'fecha_pago' => > $datos[2]))); > $i++; > } else { > $vencidos = $vencidos + array($j => array_merge($renglon, > array('membresia' => $datos[0], 'anio' => $datos[1], 'fecha_pago' => > $datos[2]))); > $j++; > } > } > > Cuando hago la consulta por el modelo de membresías se me complica un > poco más por que cada registro sería una membresía, y de ahí no sabría > cómo podría obtener la más reciente por socio. > > Lo último que estuve intentando es usa consultas con $this->query, > pero no encuentro la adecuada. En este momento andaba jugando con esta > (y variantes): > > $consulta = 'SELECT CONCAT(Socio.nombre," ",Socio.aPat," ",Socio.aMat) > as name, > Socio.id, > Socio.nombre, > Socio.aPat, > Socio.aMat, > Socio.email, > Membresia.id, > Membresia.anio, > Membresia.fecha_pago FROM socios AS Socio RIGHT JOIN membresias as > Membresia ON (Membresia.socio_id = Socio.id) > WHERE Membresia.fecha_pago < $alguna_fecha > GROUP BY name > ORDER BY anio ASC, fecha_pago ASC, aPat ASC, aMat ASC, nombre ASC' > > Como hay membresía de años atrás y sólo quiero la más reciente de cada > socio, hago el GROUP BY name para tener sólo una por socio, pero el > problema es que las membresías no salen en el orden deseado, de hecho > salen sin ningún orden, y al hacer el GROUP BY queda cualquiera, no la > más reciente. > > Y bueno, al final es un detalle solamente, pero es un detalle que no > he podido resolver. ¿Alguien tiene alguna idea? > > Saludos. > > On 4 dic, 19:58, Gerardo Glez <[EMAIL PROTECTED]> wrote: > > > Fractalix, > > > Prueba haciendo la consulta a la inversa en el modelo que tenga la > > relacion belongsTo (o sea usando el JOIN que aplica en esa relacion). > > Algo asi como $this->Socio->Membresia->findAll('Membresia.fecha_pago > > > >= '.$fecha_pago); --~--~---------~--~----~------------~-------~--~----~ Has recibido este mensaje porque estás suscrito a Grupo "CakePHP-es" de Grupos de Google. Si quieres publicar en este grupo, envía un mensaje de correo electrónico a CakePHP-es@googlegroups.com Para anular la suscripción a este grupo, envía un mensaje a [EMAIL PROTECTED] Para obtener más opciones, visita este grupo en http://groups.google.com/group/CakePHP-es?hl=es. -~----------~----~----~----~------~----~------~--~---