total consultas laravel laravel-4 query-builder

consultas - get total rows laravel



DB-> count() devuelve un valor diferente de count(DB-> get()) (2)

Tengo la más simple de las consultas que estoy tratando de ejecutar

DB::table(''user_visits'')->groupBy(''user_id'')->count();

Pero está devolviendo el número equivocado, 8.

Si lo cambio a esto:

count(DB::table(''user_visits'')->groupBy(''user_id'')->get());

Luego devuelve el número correcto, 34. ¿Por qué estos no tienen el mismo valor?

Aquí está la estructura de mi mesa

user_visits( user_id, date_visited, num_clicks )


Una nota sobre la depuración
Las consultas generadas por esos dos enfoques diferentes son completamente diferentes, y es por eso que esto le está sucediendo a usted. Siempre que experimente problemas de DB, siempre es una buena idea mirar el registro de consultas subyacente, para que pueda ver lo que se está ejecutando:

dd(DB::getQueryLog());

que imprimirá el registro de consultas, si lo hace justo después de las búsquedas ofensivas, puede ir al final del registro para su última consulta (es decir, si lo colocó después de la segunda búsqueda, la última consulta en el registro sea ​​su contador envuelto, y la última pero única consulta sería el método de recuento).

Su problema específico
De todos modos, para explicar su problema específico. Las dos consultas que se generan serán como

DB::table(''user_visits'')->groupBy(''user_id'')->count(); // SELECT COUNT(*) from user_visits GROUP BY user_id

Esto devolverá el recuento de entradas en cada grupo. Lo que está haciendo mysql es agrupar todas las filas por la columna user_id, y luego devolver una fila por grupo con los conteos. Si agregamos el "user_id" en las columnas para la selección y ejecutamos la consulta manualmente en su base de datos, es posible que vea algo como esto como resultado

// SELECT user_id, COUNT(*) FROM user_visits GROUP BY user_id ---------------------- | user_id | COUNT(*) | ---------------------- | 1 | 8 | | 2 | 4 | | 5 | 11 | ----------------------

Tu segunda consulta es diferente

DB::table(''user_visits'')->groupBy(''user_id'')->get() // SELECT * FROM user_visits GROUP BY user_id

Lo que está haciendo esto es simplemente seleccionar todas las entradas, agrupándolas y devolviéndolas. En este caso, se devuelve una fila por ID de usuario, y esa fila contiene toda la información de UNA de las entradas para ese user_id (podría ser la primera entrada para ese usuario, podría ser la última, podría ser aleatoria) , sin embargo no importa).

Su count() luego cuenta cuántas filas se devolvieron, que será el recuento de user_ids únicos.

Por lo tanto, su primera consulta es contar cuántos user_ids por grupo hay (y laravel devolverá el primer registro cuando intente imprimir el resultado, lo que resultará en la visualización del número de entradas para el primer user_id en el conjunto de resultados), y su segundo consulta (más la función de recuento aplicada) devuelve cuántos grupos se encontraron (es decir, número de user_ids únicos).

Usando mi tabla de arriba, para ilustrar esto ...

Consulta 1: devolvería "8", ya que ese es el conteo, para la primera entrada en el conjunto de resultados
Consulta 2: devolvería "3", ya que ese es el recuento, para el número de filas en el conjunto de resultados

¿Quieres el número correcto, sin cargar todos los datos?
Si desea obtener el resultado correcto según su segunda consulta, pero desea la respuesta entera única liviana y menos pesada de la consulta 1, puede hacer esto:

DB::table(''user_invites'')->count(DB::raw(''DISTINCT user_id''))

lo que resulta en:

SELECT COUNT(DISTINCT user_id) FROM user_visits;

Afortunadamente, todo tiene sentido, es un poco confuso para captar la atención, estoy seguro


Puede probar esto porque la instrucción group by se ejecuta después del count ( Bug # 26209 ):

DB::table(''user_visits'')->distinct(''user_id'')->count(''user_id'');

Otra respuesta mySql aquí.