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

MySql Query, contar miembros por categoria

Estas en el tema de MySql Query, contar miembros por categoria en el foro de Mysql en Foros del Web. Hola, necesito ayuda con este query en Mysql Tabla hobbies. hobby_ID hobby_name 1 Ver TV 2 Oir Música 3 Internet 4 Caminar 5 Correr 6 ...
  #1 (permalink)  
Antiguo 11/05/2011, 01:37
Avatar de allhen  
Fecha de Ingreso: septiembre-2005
Mensajes: 243
Antigüedad: 18 años, 7 meses
Puntos: 1
Exclamación MySql Query, contar miembros por categoria

Hola, necesito ayuda con este query en Mysql

Tabla hobbies.

hobby_ID hobby_name
1 Ver TV
2 Oir Música
3 Internet
4 Caminar
5 Correr
6 Ir al cine
7 Leer

Table people

ID name hobby_ID

1 AAA AAA 1
2 BBB BBB 1,2,5
3 CCC CCC 2,3,5
4 DDD DDD 3,5
5 EEE EEE 4,6,5
6 FFF FFF

Quiero contar a cuantas personas les gusta determinado hobby.

Deberia retornar algo asi

Ver TV (2)
Oir Música (2)
Internet (2)
Caminar (1)
Correr(4)
Ir al cine (1)
Leer

Y si fuese posible solo mostrar los hobbies q tengan mas de 1 persona q le gusta.


La estructura es correcta o se debe modificar de acuerdo a lo sgte?


*Repeating groups within columns
http://en.wikipedia.org/wiki/First_n...within_columns

*A design that complies with 1NF
http://en.wikipedia.org/wiki/First_n...plies_with_1NF

Sldos.
__________________
En esta vida todo es posible ... excepto vencer a la muerte .
  #2 (permalink)  
Antiguo 11/05/2011, 01:41
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: MySql Query, contar miembros por categoria

Si una persona puede tener más de un hobby deberías hacer una tabla que relacionara personas y hobbys, no poner los hobbys en la tabla de personas, de tal forma que te quedarían tres tablas

Hobbies (ID, nombre)
Personas (ID, nombre)
RHobbiesPersonas (ID_Hobby, ID_Persona)
  #3 (permalink)  
Antiguo 11/05/2011, 01:44
Avatar de allhen  
Fecha de Ingreso: septiembre-2005
Mensajes: 243
Antigüedad: 18 años, 7 meses
Puntos: 1
Respuesta: MySql Query, contar miembros por categoria

Las tablas ya estan creadas asi, yo he creado la tabla de la manera q sugieres en otros proyectos.

Se podrá o esta dificíl?

Sldos.
__________________
En esta vida todo es posible ... excepto vencer a la muerte .
  #4 (permalink)  
Antiguo 11/05/2011, 01:49
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: MySql Query, contar miembros por categoria

Tendrías que parsear los hobies de las personas por lo que no es tan facil como si estuviera el modelo hecho correctamente. ¿Se puede hacer? Posiblemente, pero ya te digo que no de una forma facil.
  #5 (permalink)  
Antiguo 11/05/2011, 08:36
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: MySql Query, contar miembros por categoria

Hola allhen:

Cita:
Las tablas ya estan creadas asi, yo he creado la tabla de la manera q sugieres en otros proyectos.
Me pregunto en donde encontraste una sugerencia para modelar las tablas tal y como lo estás haciendo, ya que creo yo que el modelo E-R que mejor se adapta a este problema es justamente el que plantea Heimish2000. Me gustaría que nos dijeras dónde encontraste la referencia con esta sugerencia para investigar si tiene algún tipo de ventaja.

Tampoco nos dices de qué tipo son los datos de tus columnas, así es que voy a suponer que se trata solamente de campos tipo INT y VARCHAR.

Se me ocurre en estos momentos que hagas lo siguiente:

Código MySQL:
Ver original
  1. mysql> create table hobbies (hobby_ID int, hobby_name varchar(50));
  2. Query OK, 0 rows affected (0.06 sec)
  3.  
  4. mysql> insert into hobbies values
  5.     -> (1, 'Ver TV'), (2, 'Oir Música'), (3, 'Internet'), (4, 'Caminar'),
  6.     -> (5, 'Correr'), (6, 'Ir al cine'), (7, 'Leer');
  7. Query OK, 7 rows affected (0.03 sec)
  8. Records: 7  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> select * from hobbies;
  11. +----------+------------+
  12. | hobby_ID | hobby_name |
  13. +----------+------------+
  14. |        1 | Ver TV     |
  15. |        2 | Oir Música |
  16. |        3 | Internet   |
  17. |        4 | Caminar    |
  18. |        5 | Correr     |
  19. |        6 | Ir al cine |
  20. |        7 | Leer       |
  21. +----------+------------+
  22. 7 rows in set (0.00 sec)
  23.  
  24. mysql> create table people (ID int, name varchar(50), hobby_ID varchar(50));
  25. Query OK, 0 rows affected (0.06 sec)
  26.  
  27. mysql> insert into people values
  28.     -> (1, 'AAA AAA', '1'), (2, 'BBB BBB', '1,2,5'), (3, 'CCC CCC', '2,3,5'),
  29.     -> (4, 'DDD DDD', '3,5'), (5, 'EEE EEE', '4,6,5'), (6, 'FFF FFF', null);
  30. Query OK, 6 rows affected (0.02 sec)
  31. Records: 6  Duplicates: 0  Warnings: 0
  32.  
  33. mysql> select * from people;
  34. +------+---------+----------+
  35. | ID   | name    | hobby_ID |
  36. +------+---------+----------+
  37. |    1 | AAA AAA | 1        |
  38. |    2 | BBB BBB | 1,2,5    |
  39. |    3 | CCC CCC | 2,3,5    |
  40. |    4 | DDD DDD | 3,5      |
  41. |    5 | EEE EEE | 4,6,5    |
  42. |    6 | FFF FFF | NULL     |
  43. +------+---------+----------+
  44. 6 rows in set (0.00 sec)
  45.  
  46. mysql> select T1.hobby_name,
  47.     -> (
  48.     -> select count(*)
  49.     -> from people T2
  50.     -> where find_in_set(T1.hobby_id, T2.hobby_id) > 0
  51.     -> ) total
  52.     -> from hobbies T1;
  53. +------------+-------+
  54. | hobby_name | total |
  55. +------------+-------+
  56. | Ver TV     |     2 |
  57. | Oir Música |     2 |
  58. | Internet   |     2 |
  59. | Caminar    |     1 |
  60. | Correr     |     4 |
  61. | Ir al cine |     1 |
  62. | Leer       |     0 |
  63. +------------+-------+
  64. 7 rows in set (0.00 sec)

Para darle el formato que quieres (con el total entre paréntesis) utiliza una función CONCAT.

Igual y alguien pueda encontrar una manera más fácil de obtener el mismo resultado.

Saludos y espero tus comentarios.
Leo.
  #6 (permalink)  
Antiguo 11/05/2011, 08:47
Avatar de allhen  
Fecha de Ingreso: septiembre-2005
Mensajes: 243
Antigüedad: 18 años, 7 meses
Puntos: 1
Respuesta: MySql Query, contar miembros por categoria

Cita:
Iniciado por leonardo_josue Ver Mensaje
Me pregunto en donde encontraste una sugerencia para modelar las tablas tal y como lo estás haciendo, ya que creo yo que el modelo E-R que mejor se adapta a este problema es justamente el que plantea Heimish2000. Me gustaría que nos dijeras dónde encontraste la referencia con esta sugerencia para investigar si tiene algún tipo de ventaja.
Pues, esa estructura de la tabla ya se encontraba diseñada por otro programador, nunca habia contado registros almacenados de esa forma (1,2,3,4) lo hacia como sugiere Heimish2000, asi q estaba pensando en alterar la tabla y todas las funciones.

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hobbies (ID, nombre)
Personas (ID, nombre)
RHobbiesPersonas (ID_Hobby, ID_Persona)
Lo q encontre sobre las estructuras de tablas.
Cita:
Aguantará 1 millón de records, de una manera rápida el query cuando alcanze dicha cifra?

Voy a probar tu código....
__________________
En esta vida todo es posible ... excepto vencer a la muerte .
  #7 (permalink)  
Antiguo 11/05/2011, 12:31
Avatar de allhen  
Fecha de Ingreso: septiembre-2005
Mensajes: 243
Antigüedad: 18 años, 7 meses
Puntos: 1
Respuesta: MySql Query, contar miembros por categoria

@leonardo_josue 1 millón de gracias, adapte tu código con todas las tablas, datos q necesitaba y funciona perfectamente.



Sldos.
__________________
En esta vida todo es posible ... excepto vencer a la muerte .
  #8 (permalink)  
Antiguo 11/05/2011, 12:38
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: MySql Query, contar miembros por categoria

allhen, un millón de "de nadas", jejeje. Me da gusto que te haya servido el código.

Saludos.
Leo.

Etiquetas: query, categorias
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 23:48.