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

contar los valores repetidos de una tabla?

Estas en el tema de contar los valores repetidos de una tabla? en el foro de Mysql en Foros del Web. Hola, Tengo creado un sistema de comentarios y uno de usuarios. En el momento que uno publica un comentario, en la tabla de comentarios se ...
  #1 (permalink)  
Antiguo 24/02/2011, 10:11
Avatar de urtcor  
Fecha de Ingreso: agosto-2010
Mensajes: 15
Antigüedad: 13 años, 8 meses
Puntos: 0
Busqueda contar los valores repetidos de una tabla?

Hola,
Tengo creado un sistema de comentarios y uno de usuarios. En el momento que uno publica un comentario, en la tabla de comentarios se guarda la idUsuario de la persona que ha comentado.
Es decir, para cada comentario se crea:
idComentario | comentario | idUsuario | fecha

Lo que quiero es poder publicar cuantos comentarios ha hecho cada uno, es decir poder contar cuantas veces esta repetido el valor de cada idUsuario

He estado investigando y he encontrado algo sobre GROUP BY.. pero no acabo de entender como aplicarlo.. y como mostrar la consulta en php :S

Alguien me podría ayudar?
Gracias.
  #2 (permalink)  
Antiguo 24/02/2011, 10:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: contar los valores repetidos de una tabla?

Hola urtcor:

La consulta que deseas obtener es básica pasa cualquiera con algo de conocimientos de SQL... me parece realmente extraño que tengas problemas para obtenerla por tu propia cuenta, creo que deberías tomarte más tiempo para leer algún manual de fundamentos de SQL. La consulta quedaría más o menos así:

Código:
select idUsuario, count(*) as TotalComentarios from TuTabla group by idUsuario
En cuando a mostrar los resultados utilizando PHP, pues lamentablemente no tengo experiencia con ese lenguaje, igual y sería conveniente que publicaras tus preguntas con respecto a este lenguaje en el foro de PHP que está disponible en este mismo sitio.

Saludos
Leo.
  #3 (permalink)  
Antiguo 24/02/2011, 13:42
Avatar de urtcor  
Fecha de Ingreso: agosto-2010
Mensajes: 15
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: contar los valores repetidos de una tabla?

Muchas gracias Leo,
Esque la mayoria de veces he estado usando prácticamente las mismas instrucciones de SQL y ahora no entendía como utilizar el group by,el count..
Entonces finalmente qedaria asi:

$query="SELECT idUsuario,count(*) as TotalComentarios FROM comentarios group by idUsuario";
$result = mysql_query ($query, $dbConn);

Ahora a ver si consigo mostrar los resultados con php...porq no me sale de ninguna forma.. :S

Gracias!
  #4 (permalink)  
Antiguo 27/02/2011, 11:06
Avatar de urtcor  
Fecha de Ingreso: agosto-2010
Mensajes: 15
Antigüedad: 13 años, 8 meses
Puntos: 0
Busqueda Respuesta: problema con Inner Join?

Hola,
Ya conseguí que me leyera la ID del usuario y me contara los comentarios de cada uno, pero ahora estoy intentando que me relacione esta ID con su nombre de usuario. Para que figure en la tabla el nombre y no la ID.

Con este codigo me muestra la ID que esta en el campo idUsuario:

$query="SELECT idUsuario,count(*) as TotalComentarios
FROM comentarios group by idUsuario
ORDER BY TotalComentarios DESC
";

Luego, en la tabla 'usuarios' tengo las columnas idUsuario | usuario . Lo que quiero es que substituya la id del usuario y ponga su nomre a la hora de escribirlo.
He provado con INNER JOIN pero no me funciona bien..
El codigo seria este:
Código PHP:
$query="SELECT idUsuario,count(*) as TotalComentarios 
FROM comentarios group by idUsuario
INNER JOIN `usuarios` ON comentarios.idUsuario = usuarios.usuario 

ORDER BY TotalComentarios DESC
"

Saveis cual puede ser el error... o si se puede hacer de otra forma?

Muchas gracias.
Un saludo.
  #5 (permalink)  
Antiguo 28/02/2011, 08:51
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: problema con Inner Join?

Cita:
Iniciado por urtcor Ver Mensaje
Hola,
El codigo seria este:
Código PHP:
$query="SELECT idUsuario,count(*) as TotalComentarios 
FROM comentarios group by idUsuario
INNER JOIN `usuarios` ON comentarios.idUsuario = usuarios.usuario 

ORDER BY TotalComentarios DESC
"

Hola urtcor:

Por lo que veo no tienes experiencia con el lenguaje de consultas SQL, te recomendaría que leas algún manual (el que sea) sobre fundamentos de SQL para que sea más fácil resolver tus problemas.

El problema está en el orden en que estás colocando la cláusula GROUP BY, ya que esta debe ir después de todos tus INNER JOIN. Intenta con esto

Código:
SELECT T1.idUsuario, T2.usuario, count(*) as TotalComentarios 
FROM comentarios T1
INNER JOIN usuarios T2 ON T1.idUsuario = T2.usuario 
GROUP BY T1.idUsuario, T2.usuario
ORDER BY 3 DESC
Haz la prueba y nos comentas.

Saludos
Leo.
  #6 (permalink)  
Antiguo 28/02/2011, 09:30
 
Fecha de Ingreso: septiembre-2009
Ubicación: Cuenca
Mensajes: 57
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: contar los valores repetidos de una tabla?

Hola a todos, mejor que inner join es un left join o right join debido que las relaciones internas entre registros es más rápido por ser menor, en cambio inner join hace comparaciones entre absolutamente todos los registros de una tabla:
Código SQL:
Ver original
  1. SELECT usr.nombreusuario, COUNT(*) 'TotalComentarios'
  2. FROM comentarios com LEFT JOIN usuarios usr ON com.idusuarios=usr.id
  3. GROUP BY usr.nombreusuario;
Esto es muy rapido y util en su búsqueda y recomiendo que para este caso uses left join (por el orden dado de las tablas). Te recomiendo que siempre verifiques la velocidad de consulta con DESC o EXPLAIN que ya lo verifiqué. Recuerda que siempre un tipo de búsqueda 'eq_ref' es muchísimo más rápido que 'ref' y en este caso lo hace con el primero
  #7 (permalink)  
Antiguo 01/03/2011, 16:22
Avatar de urtcor  
Fecha de Ingreso: agosto-2010
Mensajes: 15
Antigüedad: 13 años, 8 meses
Puntos: 0
Busqueda Respuesta: contar los valores repetidos de una tabla?

Hola!
Antes que nada gracias por vuestro tiempo Leo y Pancho ;)
La verdad que si que tenia que leer más sobre sql..lo que pasa que me metí en php y pensaba que sql era más complementario y tal.. y veo que es completamente diferente..y vamos todo un lenguaje..

He provado lo que me habéis dicho los dos pero no consigo mostrar el nombre de usuario :S no se si es que lo hago mal o la consulta que quiero hacer no se puede... :S

El metodo de Leo quedaria asi:
Código PHP:
$query="SELECT comentarios.idUsuario, count(*) as TotalComentarios 
FROM comentarios
INNER JOIN usuarios ON comentarios.idUsuario = usuarios.usuario
GROUP by comentarios.idUsuario"

seria contar todas las idUsuario de la tabla comentarios, luego poner que el idUsuario de la tabla comentarios sea igual a el usuario de la tabla usuarios, y ordenarlo todo por idUsuario de la tabla comentarios.

De esta forma no me muestra nada :S y he provado variando cosas pero no me funciona :S
_____

El codigo de Pancho, me pasa algo distinto.
Me qedo asi:
Código PHP:
$query="SELECT comentarios.idUsuario,count(*) as TotalComentarios 
FROM comentarios LEFT JOIN usuarios ON comentarios.idUsuario = usuarios.usuario
GROUP by comentarios.idUsuario"

Y poniendo eso, es curioso pero solo me escribe en la web el numero de comentarios, pero no me escribe nada en la parte de usuario. (depende también de la variable que recoja para mostrar). Si vuelvo a mostrar idUsuario me sale otra vez el idUsuario.

Supongo que también es importante la manera de mostrar los resultados. Primero defino un array:
$arrTOTALES = array();
Luego de la peticion hago
$resultado = mysql_query ($query, $dbConn);
while ($row=mysql_fetch_assoc($resultado)){
array_push( $arrTOTALES,$row );
}

Y los escribo en la parte correspondiente con
<? foreach ($arrTOTALES as $totales) { ?>
<? echo $totales['idUsuario']?> /// para la parte de idUsuario o en caso de querer mostrar el nombre de usuario, q es lo q no me sale, pongo <? echo $totales['usuario']?>
<? echo $totales['TotalComentarios']?> /// para mostrar el numero total de comentarios

Bueno en principio tendría que funcionar si me muestra la id y el numero de comentarios.. si canviar casi nada..pero no funciona :S

Muchas gracias, a ver si consigo hacer esto y me pongo ya con los manuales..xD
un saludo.
  #8 (permalink)  
Antiguo 02/03/2011, 09:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: contar los valores repetidos de una tabla?

Hola de nuevo Urtcor:

Te sigo sugiriendo que leas algún manual de SQL, pues a pesar de que en los foros se te den algunas respuestas en la mayoría de las ocasiones deberás hacer ajustes a las consultas. No esperes que simplemente con copiar el código que te presentamos funcione todo de maravilla. Ojo con eso.

Estuve revisando la consulta que te puse de ejemplo y hay un error que podrías haber detectado si tuvieras un poco más de nociones de SQL. Si checas en el INNER JOIN tengo esto:

Código:
FROM comentarios T1
INNER JOIN usuarios T2 ON T1.idUsuario = T2.usuario 
Aquí está el error, ya que estoy igualando el ID del usuario con su nombre por lo tanto la consulta no marca ningún error, pero te regresa una consulta vacía.

De tal manera que lo correcto sería poner así:

Código:
FROM comentarios T1
INNER JOIN usuarios T2 ON T1.idUsuario = T2.idUsuario
Aquí te dejo una vista de la ejecución en la consola de MySQL. creo que debería de funcionar:

Código MySQL:
Ver original
  1. mysql> create table usuarios (idUsuario int, usuario varchar(50));
  2. Query OK, 0 rows affected (0.06 sec)
  3.  
  4. mysql> insert into usuarios values (1, 'Usuario UNO'), (2, 'Usuario DOS');
  5. Query OK, 2 rows affected (0.03 sec)
  6. Records: 2  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> select * from usuarios;
  9. +-----------+-------------+
  10. | idUsuario | usuario     |
  11. +-----------+-------------+
  12. |         1 | Usuario UNO |
  13. |         2 | Usuario DOS |
  14. +-----------+-------------+
  15. 2 rows in set (0.00 sec)
  16.  
  17. mysql> create table comentarios (idComentario int, comentario varchar (50), idUs
  18. uario int, fecha date);
  19. Query OK, 0 rows affected (0.06 sec)
  20.  
  21. mysql> insert into comentarios values (1, 'Comentario I', 1, curdate()), (2, 'Co
  22. mentario II', 1, curdate()), (3, 'Comentario III', 2, curdate());
  23. Query OK, 3 rows affected (0.03 sec)
  24. Records: 3  Duplicates: 0  Warnings: 0
  25.  
  26. mysql> select * from comentarios;
  27. +--------------+----------------+-----------+------------+
  28. | idComentario | comentario     | idUsuario | fecha      |
  29. +--------------+----------------+-----------+------------+
  30. |            1 | Comentario I   |         1 | 2011-03-02 |
  31. |            2 | Comentario II  |         1 | 2011-03-02 |
  32. |            3 | Comentario III |         2 | 2011-03-02 |
  33. +--------------+----------------+-----------+------------+
  34. 3 rows in set (0.00 sec)
  35.  
  36. mysql> SELECT T1.idUsuario, T2.usuario, count(*) as TotalComentarios
  37.     -> FROM comentarios T1
  38.     -> INNER JOIN usuarios T2 ON T1.idUsuario = T2.idUsuario
  39.     -> GROUP BY T1.idUsuario, T2.usuario
  40.     -> ORDER BY 3 DESC;
  41. +-----------+-------------+------------------+
  42. | idUsuario | usuario     | TotalComentarios |
  43. +-----------+-------------+------------------+
  44. |         1 | Usuario UNO |                2 |
  45. |         2 | Usuario DOS |                1 |
  46. +-----------+-------------+------------------+
  47. 2 rows in set (0.00 sec)

En cuanto a la parte de PHP, pues ahí si no puedo ayudarte, pues yo utilizo otro lenguaje de programación y no tengo conocimientos al respecto, pero te recuerdo que hay un foro exclusivo para PHP, por lo que puedes utilizarlo también para publicar tus dudas.

Saludos
Leo.
  #9 (permalink)  
Antiguo 02/03/2011, 17:40
Avatar de urtcor  
Fecha de Ingreso: agosto-2010
Mensajes: 15
Antigüedad: 13 años, 8 meses
Puntos: 0
De acuerdo Respuesta: contar los valores repetidos de una tabla?

Muchas gracias Leo!!!!!!
Ya me ha salido bien :)
Con este código:
Código MySQL:
Ver original
  1. SELECT comentarios.idUsuario, usuarios.usuario, count(*) as TotalComentarios  
  2. FROM comentarios
  3. INNER JOIN usuarios ON comentarios.idUsuario = usuarios.idUsuario
  4. GROUP BY comentarios.idUsuario, usuarios.usuario
  5. ORDER BY TotalComentarios DESC

Me faltaba a parte de la parte que tu dices, poner arriba "SELECT comentarios.idUsuario, usuarios.usuario" puesto que solo estaba poniendo uno.

Gracias de nuevo Leo, me pongo ya a leer mas sobre MySQL!! y no estorbo mas jej
Saludos.

Etiquetas: contar, repetidos, tablas
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 11:44.