Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/05/2013, 08:30
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: Combinar resultados repetidos en columnas virtuales

Hola lambar:

Acláranos algunas cosas:

1. ¿Cuantas categorías existen en tu tabla? si hablas que tienes 10000 registros y esperas que te regrese 5000, podría suponer que tienes sólo dos categorías (lo cual no me parece correcto)... supongo que en realidad podrías tener n categorías, lo cual puede complicar la consulta.

2. ¿Todos los registros tienen todas las categorías?

3. ¿Necesitas forzosamente traer la categoría y su ID en columnas separadas?

Hay varias formas para hacer lo que quieres, aunque como te dije, la consulta se puede complicar dependiendo de lo que necesitas hacer... por un lado, podrías utilizar la función GROUP_CONCAT, la cual te regresa una columna con la agrupación de los elementos que indiques, separados por comas... sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT products_model pmol, products_image pimg,
  2.     ->   products_price ppri, manufacturers_name maname, products_name pname,
  3.     ->   categories_id cid, categories_name cname
  4.     -> FROM tabla;
  5. +---------+------------+--------+--------+------------+------+---------+
  6. | pmol    | pimg       | ppri   | maname | pname      | cid  | cname   |
  7. +---------+------------+--------+--------+------------+------+---------+
  8. | Auviart | img_si.gif | 2.9900 | Abba   | Chiquitita |   36 | Pop     |
  9. | Auviart | img_si.gif | 2.9900 | Abba   | Chiquitita |   41 | Espanol |
  10. | otra    | otra.gif   | 2.9900 | Algo   | Nada       |   36 | Pop     |
  11. +---------+------------+--------+--------+------------+------+---------+
  12. 3 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT
  15.     ->   products_model pmol, products_image pimg,
  16.     ->   products_price ppri, manufacturers_name maname, products_name pname,
  17.     ->   GROUP_CONCAT(CONCAT(categories_id, '-', categories_name)) categorias
  18.     -> FROM tabla
  19.     -> GROUP BY
  20.     ->   products_id, products_model, products_image,
  21.     ->   products_price, manufacturers_id, manufacturers_name, products_name;
  22. +---------+------------+--------+--------+------------+-------------------+
  23. | pmol    | pimg       | ppri   | maname | pname      | categorias        |
  24. +---------+------------+--------+--------+------------+-------------------+
  25. | Auviart | img_si.gif | 2.9900 | Abba   | Chiquitita | 36-Pop,41-Espanol |
  26. | otra    | otra.gif   | 2.9900 | Algo   | Nada       | 36-Pop            |
  27. +---------+------------+--------+--------+------------+-------------------+
  28. 2 rows in set (0.00 sec)

Observa que en la columna CATEGORIAS, concatené el id y el nombre de la categoría... en esta consulta NO IMPORTARÍA CUANTAS CATEGORÍAS TENGAS EN TU TABLA, la función concatenaría todas las que tengas.

Existe otra manera, pero esta es un poco más complicada, pues necesitas saber exactamente cuántas categorías tienes, sería así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   products_model pmol, products_image pimg,
  3.     ->   products_price ppri, manufacturers_name maname, products_name pname,
  4.     ->   MAX(IF(categories_name = 'Pop', categories_name, NULL)) cpop,
  5.     ->   MAX(IF(categories_name = 'Espanol', categories_name, NULL)) cespanol
  6.     -> FROM tabla
  7.     -> GROUP BY
  8.     ->   products_id, products_model, products_image,
  9.     ->   products_price, manufacturers_id, manufacturers_name, products_name;
  10. +---------+------------+--------+--------+------------+------+----------+
  11. | pmol    | pimg       | ppri   | maname | pname      | cpop | cespanol |
  12. +---------+------------+--------+--------+------------+------+----------+
  13. | Auviart | img_si.gif | 2.9900 | Abba   | Chiquitita | Pop  | Espanol  |
  14. | otra    | otra.gif   | 2.9900 | Algo   | Nada       | Pop  | NULL     |
  15. +---------+------------+--------+--------+------------+------+----------+
  16. 2 rows in set (0.03 sec)

Aquí agregarías tantos MAX-IF como categorías tienes... y si quisieras también el ID, tendrías que agregar el respectivo MAX-IF para esos campos...

Hay una forma de hacer esto de manera automática, investiga un poco esta liga:

http://www.artfulsoftware.com/infotr...tip.php?id=523

Saludos
Leo.