Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/05/2011, 08:36
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.