Yii Framework Forum: Error al hacer COUNT con CActiveDataProvider - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Error al hacer COUNT con CActiveDataProvider Rate Topic: -----

#1 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 31 May 2010 - 11:36 PM

Estoy tratando de filtrar resultados de un CActiveDataProvider que luego muestro en un CListView .. Pues sucede que yii normalmente hace 2 consultas, la primera para obtener un COUNT de resultados y la segunda es la consulta para obtener los datos.. solo que al hacer el COUNT no esta respetando la condicion basica para poder realizar el filtrado.. vean de lo que hablo..

Consulta 1 :: COUNT :: Lo que hace Yii
SELECT COUNT(DISTINCT t.id) FROM tabla t WHERE nombre LIKE ('%tel%')
// Genera 30 registros encontrados

Consulta 2 :: Resultados
SELECT DISTINCT(codigo) FROM tabla WHERE nombre LIKE ('%tel%')
// Genera 2 registros encontrados

Consulta 3 :: COUNT :: Lo que deberia de hacer Yii
SELECT COUNT(DISTINCT t.codigo) FROM tabla t WHERE nombre LIKE ('%tel%')
// Genera 2 registros encontrados


En realidad la consulta 1 esta mal, porque hace DISTINCT del id de la tabla (id es un campo autoincremental que nunca se repite lo que genera mas resultados de los que deberian de ser), yo lo que necesito es que haga COUNT pero del DISTINCT t.codigo que seria como una forma de agrupar los resultados..

Alguien sabe de que manera puedo yo personalizar el COUNT o decirle que el lugar de tomar el id de la tabla tome el campo codigo ??
Celestic Dev Team
Yii Open Source Project Manager
0

#2 User is offline   Horacio Segura 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 01 June 2010 - 05:18 PM

View PostJack Fiallos, on 31 May 2010 - 11:36 PM, said:

Estoy tratando de filtrar resultados de un CActiveDataProvider que luego muestro en un CListView .. Pues sucede que yii normalmente hace 2 consultas, la primera para obtener un COUNT de resultados y la segunda es la consulta para obtener los datos.. solo que al hacer el COUNT no esta respetando la condicion basica para poder realizar el filtrado.. vean de lo que hablo..

Consulta 1 :: COUNT :: Lo que hace Yii
SELECT COUNT(DISTINCT t.id) FROM tabla t WHERE nombre LIKE ('%tel%')
// Genera 30 registros encontrados

Consulta 2 :: Resultados
SELECT DISTINCT(codigo) FROM tabla WHERE nombre LIKE ('%tel%')
// Genera 2 registros encontrados

Consulta 3 :: COUNT :: Lo que deberia de hacer Yii
SELECT COUNT(DISTINCT t.codigo) FROM tabla t WHERE nombre LIKE ('%tel%')
// Genera 2 registros encontrados


En realidad la consulta 1 esta mal, porque hace DISTINCT del id de la tabla (id es un campo autoincremental que nunca se repite lo que genera mas resultados de los que deberian de ser), yo lo que necesito es que haga COUNT pero del DISTINCT t.codigo que seria como una forma de agrupar los resultados..

Alguien sabe de que manera puedo yo personalizar el COUNT o decirle que el lugar de tomar el id de la tabla tome el campo codigo ??



creo que no se puede en algunos casos como este y los que usan group , having ....

lo que si podes hacer es calcular el count por separado

Quote


hay varias formas de hacerlo, en este momento no tengo a mano la solucion que uso yo,
pero si no podes avisame y la posteo
creo que con findBySql
o queryScalar podes hacerlo



y usar http://www.yiiframew...temCount-detail


saludos
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
http://hmsegura.blogspot.com/
0

#3 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 01 June 2010 - 10:47 PM

Muchas gracias por la respuesta Horacio.. inicialmente pense que utilizaria queryScalar con una consulta, pero viendo que podia usar setTotalItemCount decidi hacerlo mas facil.. y quedo lo siguiente:

$dataProvider->setTotalItemCount(count(Modelo::model()->findAll($criteria)));


Donde criteria es el parametro por el cual realizo la busqueda..

thnx !!
Celestic Dev Team
Yii Open Source Project Manager
0

#4 User is offline   Horacio Segura 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 02 June 2010 - 05:41 AM

View PostJack Fiallos, on 01 June 2010 - 10:47 PM, said:

Muchas gracias por la respuesta Horacio.. inicialmente pense que utilizaria queryScalar con una consulta, pero viendo que podia usar setTotalItemCount decidi hacerlo mas facil.. y quedo lo siguiente:

$dataProvider->setTotalItemCount(count(Modelo::model()->findAll($criteria)));


Donde criteria es el parametro por el cual realizo la busqueda..

thnx !!



ok!

Pero ten en cuenta el costo/beneficio de hacer un findAll y un count(php)
contra realizar un count de la base de datos solamente

saludos!!!
KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
http://hmsegura.blogspot.com/
0

#5 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 02 June 2010 - 11:38 AM

Que tipo de solucion has implementado tu Horacio para enmendar este problema ??
Celestic Dev Team
Yii Open Source Project Manager
0

#6 User is offline   Horacio Segura 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 535
  • Joined: 11-August 09
  • Location:Argentina

Posted 03 June 2010 - 06:33 AM

View PostJack Fiallos, on 02 June 2010 - 11:38 AM, said:

Que tipo de solucion has implementado tu Horacio para enmendar este problema ??


intenta esto
A- Crea una variable cantidad en la clase del modelo (en nuestro caso llamaremos al modelo Tabla)

       class Tabla extends CActiveRecord {
           public $cantidad;
        ....
   

B- en el controlador, tienes que modificar el criterio temporalmente para hacer el count

      //aquí va el código que ya tienes    
 
     $criteria->distinct=false; //cambio a falso
     $criteria->select="COUNT(DISTINCT t.codigo) as cantidad" ; //cambio

     $cantidad=Tabla::model()->find($criteria)->cantidad;

     $criteria->distinct=true; //restauro
     $criteria->select=null;//restauro

      //sigue tu codigo

      $dataProvider->setTotalItemCount($cantidad);
      //sigue tu codigo
   

KISS - Keep It Simple Stupid
ASAP-As Soon As Possible
http://www.yiiframew...oc/cookbook/71/
http://hmsegura.blogspot.com/
0

#7 User is offline   Jack Fiallos 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 256
  • Joined: 15-October 09
  • Location:Mexico

Posted 03 June 2010 - 11:20 AM

De gran ayuda ese trozo de codigo.. adaptado a lo que necesito ha funcionado genial..

Thnx :)
Celestic Dev Team
Yii Open Source Project Manager
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users