Laravel Eloquent-distinct() y count() no funcionan correctamente juntos


Así que estoy tratando de obtener el número de pids distintos en una consulta, pero el valor devuelto es incorrecto.

Esto es lo que trato de hacer:

$ad->getcodes()->groupby('pid')->distinct()->count()

Lo que devuelve el valor "2", mientras que el valor que debe devolver, debe ser "1".

Como solución alternativa, estoy haciendo esto:

count($ad->getcodes()->groupby('pid')->distinct()->get())

Lo que funciona bien y devuelve"1"

¿Hay alguna regla donde count y distinct no pueden estar en la misma consulta? Encuentro la solución un poco "pesada" , me gustaría hacer que la consulta original funcione :(

Author: Inigo EC, 2015-02-22

9 answers

Lo siguiente debería funcionar

$ad->getcodes()->distinct('pid')->count('pid');
 64
Author: Suresh Bala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-19 09:34:01

Alguien más se encuentra con este post, y no encontrar las otras sugerencias para trabajar?

Dependiendo de la consulta específica, puede ser necesario un enfoque diferente. En mi caso, necesitaba contar los resultados de un GROUP BY, por ejemplo,

SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)

O use COUNT(DISTINCT b):

SELECT COUNT(DISTINCT b) FROM a

Después de algunas perplejidades, me di cuenta de que no había una función Laravel incorporada para esto. Así que la solución más simple fue usar use DB::raw con el método count.

$count = $builder->count(DB::raw('DISTINCT b'));

Recuerda, no uses groupBy antes de llamar count. Puede aplicar groupBy más tarde, si lo necesita para obtener filas.

 9
Author: Zoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-20 10:38:37

Una respuesta más genérica que me habría ahorrado tiempo, y espero que otros:

No funciona (devuelve el recuento de todas las filas):

DB::table('users')
            ->select('first_name')
            ->distinct()
            ->count();

La solución:

DB::table('users')
            ->distinct()
            ->count('first_name');
 7
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 18:43:15

Tuve un problema similar, y encontré una manera de solucionarlo.

El problema es la forma en que el generador de consultas de Laravel maneja los agregados. Toma el primer resultado devuelto y luego devuelve el valor 'aggregate'. Esto suele estar bien, pero cuando combinas count con groupBy estás devolviendo un count por elemento agrupado. Así que el agregado de la primera fila es solo un recuento del primer grupo (por lo que es probable que algo bajo como 1 o 2).

Así que el conteo de Laravel está fuera, pero combiné el Laravel generador de consultas con un poco de SQL sin procesar para obtener un recuento preciso de mis resultados agrupados.

Para su ejemplo, espero que lo siguiente funcione (y le permita evitar el get):

$query = $ad->getcodes()->groupby('pid')->distinct();
$count = count(\DB::select($query->toSql(), $query->getBindings()));

Si desea asegurarse de que no está perdiendo el tiempo seleccionando todas las columnas, puede evitarlo al crear su consulta:

 $query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();
 3
Author: Matt McDonald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-21 09:20:01

¿No funcionaría esto?

$ad->getcodes()->distinct()->get(['pid'])->count();

Ver aquí para discusión..

 1
Author: JonnyFoley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-13 10:50:16

Intente lo siguiente:

$ad->getcodes()->groupby('pid')->distinct()->get()->count()
 0
Author: Ragnarsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-21 22:21:30

Me encontré con el mismo problema.

Si instala laravel debug bar, puede ver las consultas y, a menudo, ver el problema

$ad->getcodes()->groupby('pid')->distinct()->count()

Cambiar a

$ad->getcodes()->distinct()->select('pid')->count()

Es necesario establecer los valores para devolver como distintos. Si no configura los campos de selección, devolverá todas las columnas de la base de datos y todas serán únicas. Por lo tanto, establezca la consulta en distinct y solo seleccione las columnas que conforman su valor 'distinct' que podría querer agregar más. ->select('pid','date') para obtener todos los valores únicos de un usuario en un día

 0
Author: Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 00:47:01
DB::table('adverts')->distinct()->select('ad_advertiser')->get()
 0
Author: Gurpreet Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-26 09:18:12

Esto estaba funcionando para mí, así que Prueba Esto: ad ad->getcodes ()->distinct('pid') - >count ()

 -1
Author: Sushant Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 11:35:32