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.

-~----------~----~----~----~------~----~------~--~---

Responder a