Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Utilizar de forma correcta COUNT()

Estas en el tema de Utilizar de forma correcta COUNT() en el foro de Mysql en Foros del Web. Tengo esta consulta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT *, COUNT ( P . idpost ) count_post FROM posts P         ...
  #1 (permalink)  
Antiguo 21/03/2014, 07:24
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Utilizar de forma correcta COUNT()

Tengo esta consulta

Código SQL:
Ver original
  1. SELECT *, COUNT(P.idpost) count_post FROM posts P
  2.                                 INNER JOIN
  3.                                         subcategories S
  4.                                 ON
  5.                                         S.idsubcategorie=P.idsubcategorie
  6.                                 WHERE
  7.                                         S.subcategorie=var

El problema es que de esta manera solo me devuelve un registro, intuyo que es por realizar COUNT() sin GROUP BY.

Al añadir GROUP BY queda así

Código SQL:
Ver original
  1. SELECT *, COUNT(P.idpost) count_post FROM posts P
  2.                                 INNER JOIN
  3.                                         subcategories S
  4.                                 ON
  5.                                         S.idsubcategorie=P.idsubcategorie
  6.                                 WHERE
  7.                                         S.subcategorie=var
  8.                                 GROUP BY P.idpost

El problema es que de esta forma "desglosa" count y va atribuyendo en cada referencia count_post el valor 1 por cada post. (si quisiera conocer el total tendría que ir sumando del lado del CGI, por lo que COUNT ya no serviría de nada, directamente podría sumar con el CGI, y eso es lo que quiero evitar).

Entonces si añado en la consulta WITH ROLLLUP en la cláusula WHERE, justo después del GROUP BY, el problema está en que el último array lo repite para poder hacer así la suma, además de añadir en cada referencia el valor 1 al final hace la suma total, pero repite el array.

La pregunta es

¿Hay alguna manera de que en vez de repetir el último array con los datos del último post y la suma, este último array solo tenga los datos de la suma?

Para tener un array limpio, ordenado y a la hora de recorrerlo para imprimir, etc. no duplicar registros, etc.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 21/03/2014, 07:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Utilizar de forma correcta COUNT()

Partamos de la base, que COUNT(), es decir contar, sólo tiene sentido si vas a contar un total (único registro), o subtotales de grupos de registros en base a algún criterio común.
Si no quieres hacer ni uno ni otro, será mejor que nos digas cuál es el objetivo de ese COUNT() en tu aplicación.
Probablemente no sea eso lo que debes hacer...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/03/2014, 08:18
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Utilizar de forma correcta COUNT()

Muchas gracias gnzsoloyo (siempre aprendiendo de ti :D )

El primer objetivo es obvio, reducir todo lo posible las consultas a la DB.

El segundo objetivo tiene que ver con una paginación.

Cuando el usuario navega hasta categories, tiene la opción de ver las subcategories.

Dentro de las subcategories aparecen los posts totales en cada subcategorie (no hubo forma de poder sacar el count de posts en categories :S por eso lo trasladé a dentro de cada subcategorie).

Entonces ahora es donde viene la cuestión principal.

Cuando el usuario solicita ver los posts de una determinada subcategorie, se realiza la consulta que he desarrollado en mi primer post. La intención es solicitar todos los posts referentes a una subcategorie y los posts totales que ha obtenido.

De esta forma no tengo que hacer una consulta más para saber los posts que hay.

El total de posts es para el paginador, debo saber necesariamente el total de posts para el paginador y poder tener referencias límites que permitan navegar entre los posts de cada subcategorie determinada.
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 21/03/2014, 08:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Utilizar de forma correcta COUNT()

SI vas a recuperar si o sí todos los posts, y la resolución de la navegación la harás en la aplicación, te conviene olvidarte de contarlos, y usar el valor que la propia librería tiene para saber cuál es la cantidad de registros devueltos. Al menos yo no le veo sentido a usar ese COUNT, que de por si es incompatible con la consulta de busqueda que quieres hacer.
Ahora bien, si el tema pasa por cómo obtener una cantidad limite de registros, es decir, paginar por medio de consultas, no te queda más que un camino, y es realizar una consulta sencilla que cuente los registros antes de realizar la busqueda de posts.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/03/2014, 08:53
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Utilizar de forma correcta COUNT()

Cita:
Iniciado por gnzsoloyo Ver Mensaje
SI vas a recuperar si o sí todos los posts, y la resolución de la navegación la harás en la aplicación, te conviene olvidarte de contarlos, y usar el valor que la propia librería tiene para saber cuál es la cantidad de registros devueltos. Al menos yo no le veo sentido a usar ese COUNT, que de por si es incompatible con la consulta de busqueda que quieres hacer.
Ahora bien, si el tema pasa por cómo obtener una cantidad limite de registros, es decir, paginar por medio de consultas, no te queda más que un camino, y es realizar una consulta sencilla que cuente los registros antes de realizar la busqueda de posts.
Entonces, si entendí bien, sólo puedo hacer dos cosas:

-Hacer una consulta previa en la que MYSQL sea la encargada de contar los posts.

o

-Contar los registros devueltos con el CGI (en mi caso PHP).

Para mi ambas son válidas. Aunque como voy a paginar voy a optar por la segunda opción.

Leyendo sobre el asunto, encontré esto y no sé si hacer caso de lo que dice, porque al fin y al cabo siguen siendo dos consultas en vez de una sola:

http://quenerapu.com/mysql/me-encant...ct-found_rows/

¿Alguna opinión sobre eso?

Gracias! muchas gracias! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 21/03/2014, 10:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Utilizar de forma correcta COUNT()

Para tu caso, usar FOUND_ROWS() cumple la misma función que usar COUNT(), su uso es más específicamente en lso casos donde la consulta base utiliza LIMIT, ya qe ese valor lo que hace es retornar la cantidad de registros que habría devuelto la consulta de no haber usado LIMIT.
Pero para activarlo se necesita que la query incluya también la cláusula SQL_CALC_FOUND_ROWS (Ver manual de reverencia para más datos).
Si no usas LIMIT, entonces no la necesitas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 21/03/2014, 10:31
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Utilizar de forma correcta COUNT()

Muchas gracias gnzsoloyo, un saludo! :D
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: correcta, forma, join, registro, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:36.