Error al hacer COUNT con CActiveDataProvider

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

y usar http://www.yiiframework.com/doc/api/CDataProvider#setTotalItemCount-detail

saludos

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!!!

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

   

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

Thnx :)