laravel count eloquent distinct

Elocuente de Laravel: distinta() y cuenta() no funcionan correctamente juntas



count laravel (13)

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 debería devolver, debería ser "1".

Como solución, estoy haciendo esto:

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

lo que funciona bien y devuelve "1"

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


¿Alguien más se encontró con esta publicación y no encontró 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 , p. Ej.

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

o use COUNT(DISTINCT b) :

SELECT COUNT(DISTINCT b) FROM a

Después de pensar un poco, me di cuenta de que no había una función incorporada de Laravel para ninguno de estos. Entonces, la solución más simple fue usar DB::raw con el método count .

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

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


¿No funcionaría esto?

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

Ver here para la discusión ..


Distintivo no tome argumentos ya que agrega DISTINCT en su consulta sql, sin embargo, PUEDE necesitar definir el nombre de columna con el que desea seleccionar distinto. Por lo tanto, si tiene Flight->select(''project_id'')->distinct()->get() es equivalente a SELECT DISTINCT ''project_id'' FROM flights y ahora puede agregar otros modificadores como count () o incluso consultas elocuentes sin procesar .


Esto funcionaba para mí, así que intente esto: $ ad-> getcodes () -> distinct (''pid'') -> count ()


Intenta lo siguiente:

DB::table(''adverts'')->distinct()->select(''ad_advertiser'')->get()


Lo siguiente debería funcionar

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


Me encontré con el mismo problema.

Si instala la barra de depuración laravel, puede ver las consultas y, a menudo, ver el problema

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

cambiar a

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

Debe 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, configure la consulta como distinta y solo seleccione las columnas que conforman su valor ''distinto'' que desee agregar más. ->select(''pid'',''date'') para obtener todos los valores únicos para un usuario en un día


Puede usar la siguiente forma para obtener los datos únicos según sus necesidades de la siguiente manera,

$solution = $query->distinct() ->groupBy ( [ ''array'', ''of'', ''columns'', ] ) ->addSelect( [ ''columns'', ''from'', ''the'', ''groupby'', ] ) ->get();

Espero que esto funcione.


Tuve un problema similar y encontré una forma 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 ''agregado''. Esto suele estar bien, pero cuando combina el conteo con groupBy está devolviendo un conteo por elemento agrupado. Entonces, 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).

Por lo tanto, el recuento de Laravel está fuera, pero combiné el generador de consultas de Laravel con algunos SQL sin formato 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 no perder el tiempo seleccionando todas las columnas, puede evitarlo cuando cree su consulta:

$query = $ad->select(DB::raw(1))->getcodes()->groupby(''pid'')->distinct();


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'');


prueba esto

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


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


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

Recuerde que el grupo by es opcional, esto debería funcionar en la mayoría de los casos cuando desea que un grupo de recuento excluya valores de selección duplicados, addSelect es un método de instancia de querybuilder.