Entonces 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 alternativa, estoy haciendo esto:
count($ad->getcodes()->groupby('pid')->distinct()->get())
lo que funciona bien y devuelve "1"
¿Existe alguna regla en la que recuento y diferenciado no puedan estar en la misma consulta? Encuentro que la solución es "pesada", me gustaría que la consulta original funcione :(
pid
columna, por lo que si tiene en su tabla 2 registros, uno con pid 1, segundo con pid 2, el recuento debe devolver 2.$count = DB::table('tablename')->count(DB::raw('DISTINCT pid'));
también puede hacer:DB::table('tablename')->distinct('pid')->count('pid');
Respuestas:
Lo siguiente debería funcionar
fuente
groupBy
hace el truco.count()
parece deshabilitar o soltar eldistinct()
. ÚselogroupBy()
como se describe a lo largo de la pregunta. Editar: descubro que evengroupBy()
proporciona una diferencia encount()
comparación con laget()
siguiente al contar la matriz resultante.distinct()
función no acepta argumentos. Puede cambiarlo a$ad->getcodes()->distinct()->count('pid');
con el mismo resultado.Una respuesta más genérica que me hubiera ahorrado tiempo y, con suerte, otras:
No funciona (devuelve el recuento de todas las filas):
La solución:
fuente
¿Alguien más se ha encontrado con esta publicación y no encuentra las otras sugerencias que funcionen?
Dependiendo de la consulta específica, es posible que se necesite un enfoque diferente. En mi caso, necesitaba contar los resultados de un
GROUP BY
, por ejemploo use
COUNT(DISTINCT b)
:Después de algunas dudas, me di cuenta de que no había una función Laravel incorporada para ninguno de estos. Entonces, la solución más simple fue usar usar
DB::raw
con elcount
método.Recuerde, no lo use
groupBy
antes de llamarcount
. Puede solicitarlogroupBy
más tarde, si lo necesita para obtener filas.fuente
$books = Book::where(...)->count(...)
->count(DB::raw('DISTINCT b'))
generar la misma consulta SQL que->distinct()->count('b')
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 'agregado'. Por lo general, esto está bien, pero cuando combina count con groupBy, devuelve un recuento por elemento agrupado. Entonces, el agregado de la primera fila es solo un recuento del primer grupo (por lo que es probable que sea algo bajo como 1 o 2).
Entonces, el recuento de Laravel está fuera, pero combiné el generador de consultas de Laravel con algo 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):
Si desea asegurarse de no perder el tiempo seleccionando todas las columnas, puede evitarlo al crear su consulta:
fuente
Me encontré con el mismo problema.
Si instala la barra de depuración de laravel, puede ver las consultas y, a menudo, ver el problema
cambiar a
Debe establecer los valores para que se devuelvan como distintos. Si no establece 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 distinta y solo seleccione las columnas que componen su valor 'distinto', es posible que desee agregar más.
->select('pid','date')
para obtener todos los valores únicos para un usuario en un díafuente
Puede utilizar la siguiente forma para obtener los datos únicos según sus necesidades de la siguiente manera,
Espero que esto funcione.
fuente
¿No funcionaría esto?
Vea aquí para discusión.
fuente
get()
llamada ejecutará la consulta y devolverá los resultados de la base de datos, y luego secount()
ejecutará en la Colección.Recuerde que el grupo por 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.
fuente
Distinct no toma argumentos, ya que agrega DISTINCT en su consulta sql, sin embargo, PUEDE necesitar definir el nombre de la columna con la que desea seleccionar distinto. Por lo tanto, si tiene
Flight->select('project_id')->distinct()->get()
es equivalente aSELECT DISTINCT 'project_id' FROM flights
y ahora puede agregar otros modificadores como count () o incluso consultas elocuentes sin procesar.fuente
Según los documentos de Laravel para consultas sin procesar , pude obtener el recuento de un campo seleccionado para trabajar con este código en el modelo de producto.
Esta fachada funcionó para obtener el mismo resultado en el controlador:
El volcado resultante para ambas consultas fue el siguiente:
fuente
Esto funcionó para mí, así que intente esto: $ ad-> getcodes () -> distinto ('pid') -> count ()
fuente
prueba esto
fuente