Cómo utilizar SELECT con GROUP BY

75 views
Skip to first unread message

RománMussi

unread,
Oct 4, 2008, 8:58:34 AM10/4/08
to CakePHP en Español
Hola, soy nuevo en CakePHP y estoy necesitando ayuda con el el
siguiente problema (he simplificado al máximo el ejemplo).

Supongamos una aplicación con las siguientes tablas:

Tabla: temas

id nombre
----------------------------------------------------
1 Economía
2 Política
3 Filosofía


Tabla: libros

id tema_id titulo
-----------------------------------------------------------------------------------
1 2 El Príncipe
2 2 El contrato social
3 3 La riqueza de las naciones
4 3 Principios de economía política
5 2 Leviatán

Modelos: Tema, Libro
Asociación: Tema HasMany Libro

EL PROBLEMA

Necesito un método en TemasController que me permita mostrar solo los
temas que tienen libros asociados, y tomar la cantidad de libros en
cada caso. La vista resultante debería ser como sigue:

• Política (3)
• Filosofía (2)

No se como hacerlo con CakePHP. En otras aplicaciones lo he resuelvo
con un SELECT de la siguiente manera:

SELECT temas.id, temas.nombre, COUNT(*) AS cant
FROM temas, libros
WHERE temas.id = libros.tema_id
GROUP BY temas.id, temas.nombre

Que me devuelve:

id nombre cant
------------------------------------------------------------
2 Política 3
3 Filosofía 2

¿Cómo puedo obtener el mismo resultado con CakePHP?

Agradezco desde ya cualquier ayuda.

Saludos
Román Mussi

Daniel Zelisko

unread,
Oct 4, 2008, 10:46:10 AM10/4/08
to cakep...@googlegroups.com
Hola,

> Necesito un método en TemasController que me permita mostrar solo los
> temas que tienen libros asociados, y tomar la cantidad de libros en
> cada caso. La vista resultante debería ser como sigue:
>
> • Política (3)
> • Filosofía (2)

en el cake para las asociciaciones tipo BelongsTo puedes crear un campo
en la tabla que sea un contador para los registros asociados. o sea en
la tabla de temas añadirías un campo "libro_count" y este se supone que
automáticamente guardará la cantidad de libros acociados con cada tema.

para que funcione esto, en la definición de asocicación tienes que
configurar una variable que se llama "counterCache" y ponerla como "true"

más info aquí:
http://book.cakephp.org/view/78/Associations-Linking-Models-Together

un saludo
danielz

--
dev blog: http://blog.devayd.com

RománMussi

unread,
Oct 6, 2008, 8:22:10 AM10/6/08
to CakePHP en Español
Hola Daniel, muchas gracias por la respuesta, no conocía esa
posibilidad.

Me queda una duda: ¿existe alguna alternativa para hacer la consulta
"al vuelo" sin necesidad de crear un campo que acumule los valores?

Saludos
Román

Adrian Ariza

unread,
Oct 6, 2008, 1:31:47 PM10/6/08
to cakep...@googlegroups.com
Hola Román...
Yo hago algo asi

$all = $this->find('all', array(
'fields' => array('COUNT(*) AS cant',
'Cliente.created'
),
'order' => 'created',
'group' => 'created'
));

Seguramente se pueda mejorar, pero a mi me saco del apuro. Por ahi se
puede en vez de 'all' usar 'count' ... pero bueno, sera cuestion de
probar!

Saludos!!!


2008/10/6 RománMussi <roman...@gmail.com>:

RománMussi

unread,
Oct 6, 2008, 2:57:01 PM10/6/08
to CakePHP en Español
Gracias Adrián, voy a proban también con esta opción.
Saludos
Román

On 6 oct, 14:31, "Adrian Ariza" <hard...@gmail.com> wrote:
> Hola Román...
> Yo hago algo asi
>
> $all = $this->find('all', array(
>   'fields' => array('COUNT(*) AS cant',
>     'Cliente.created'
>   ),
>   'order' => 'created',
>   'group' => 'created'
> ));
>
> Seguramente se pueda mejorar, pero a mi me saco del apuro. Por ahi se
> puede en vez de 'all' usar 'count' ... pero bueno, sera cuestion de
> probar!
>
> Saludos!!!
>
> 2008/10/6 RománMussi <romanmu...@gmail.com>:
>
>
>
>
>
> > Hola Daniel, muchas gracias por la respuesta, no conocía esa
> > posibilidad.
>
> > Me queda una duda: ¿existe alguna alternativa para hacer la consulta
> > "al vuelo" sin necesidad de crear un campo que acumule los valores?
>
> > Saludos
> > Román
>
> > On 4 oct, 11:46, Daniel Zelisko <dan...@zelisko.net> wrote:
> >> Hola,
>
> >> > Necesito un método en TemasController que me permita mostrar solo los
> >> > temas que tienen libros asociados, y tomar la cantidad de libros en
> >> > cada caso. La vista resultante debería ser como sigue:
>
> >> > •        Política (3)
> >> > •        Filosofía (2)
>
> >> en el cake para las asociciaciones tipo BelongsTo puedes crear un campo
> >> en la tabla que sea un contador para los registros asociados. o sea en
> >> la tabla de temas añadirías un campo "libro_count" y este se supone que
> >> automáticamente guardará la cantidad de libros acociados con cada tema.
>
> >> para que funcione esto, en la definición de asocicación tienes que
> >> configurar una variable que se llama "counterCache" y ponerla como "true"
>
> >> más info aquí:http://book.cakephp.org/view/78/Associations-Linking-Models-Together
>
> >> un saludo
> >> danielz
>
> >> --
> >> dev blog:http://blog.devayd.com- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

RománMussi

unread,
Oct 13, 2008, 6:14:55 PM10/13/08
to CakePHP en Español
Hola,

Luego de buscar bastante en el grupo CakePHP en inglés encontré la
siguiente solución al problema que planteaba. Lo postéo por si a otro
le sirve.

Siguiendo con el ejemplo, puedo crear un método en TemasController,
como sigue:

function verindice() {
$this->Tema->bindModel(array('hasOne' => array('Libro')));
$resu = $this->Tema->find('all', array(
'recursive' => 0,
'fields' => array('Tema.nombre', 'COUNT(Libro.id) AS cant'),
'conditions' => '1=1 GROUP BY Tema.id'
));
// Lo siguiente es opcional, simplemente manda el
resultado a la vista
$this->set('temas', $resu);
}

Devuelve la cuenta de Libros para cada Tema.

De este modo se puede realizar el GROUP BY y contar los casos de lado
varios de la relación (o asociación, en terminos de CakePHP). Sirve
también para otras funciones además de COUNT: SUM, AVG, etc.

Una cuestión colateral se puede presentar utilizando campos calculados
y AS cuando se utilizan ciertos motores de bases de datos (los
resultados no se cargan donde uno esperaría en el array de
resultados). Pero eso ya es motivo de otro topic. El interesado puede
consultar (del grupo CakePHP en inglés):

http://groups.google.com/group/cake-php/browse_thread/thread/2fa2cd69422dfcf/72570cc98b640383

Saludos!
Román Mussi

On 4 oct, 09:58, RománMussi <romanmu...@gmail.com> wrote:
> Hola, soy nuevo en CakePHP y estoy necesitando ayuda con el el
> siguiente problema (he simplificado al máximo el ejemplo).
>
> Supongamos una aplicación con las siguientes tablas:
>
> Tabla: temas
>
> id      nombre
> ----------------------------------------------------
> 1       Economía
> 2       Política
> 3       Filosofía
>
> Tabla: libros
>
> id      tema_id titulo
> ---------------------------------------------------------------------------­--------
Reply all
Reply to author
Forward
0 new messages