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

[SOLUCIONADO] Combinar resultados repetidos en columnas virtuales

Estas en el tema de Combinar resultados repetidos en columnas virtuales en el foro de Mysql en Foros del Web. Buenos días señores, expongo mi problema: Tengo esta consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT p.products_id , p.products_model , p.products_image , p.products_price , m.manufacturers_id ...
  #1 (permalink)  
Antiguo 24/05/2013, 04:13
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Combinar resultados repetidos en columnas virtuales

Buenos días señores, expongo mi problema:

Tengo esta consulta:
Código MySQL:
Ver original
  1. SELECT p.products_id, p.products_model, p.products_image, p.products_price, m.manufacturers_id, m.manufacturers_name, d.products_name, c.categories_name, c.categories_id
  2. FROM products p
  3. LEFT JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id
  4. LEFT JOIN products_description d ON p.products_id = d.products_id
  5. AND d.language_id =3
  6. LEFT JOIN products_to_categories pc ON p.products_id = pc.products_id
  7. LEFT JOIN categories_description c ON c.categories_id = pc.categories_id
  8. AND c.language_id =3

Y me genera la siguiente salida: (10.000 resultados)

Cita:
products_id_|_products_model_|_products_image_|_pr oducts_price_|_manufacturers_id_|_manufacturers_na me_|_products_name_|_categories_name___|_categorie s_id
__________1_|_Auviart_________|_img_si.gif_____|_2 .9900_________|_1________________|_Abba___________ ____|_Chiquitita______|_Pop______________|_36
__________1_|_Auviart_________|_img_si.gif_____|_2 .9900_________|_1________________|_Abba___________ ____|_Chiquitita______|_Español__________|_41

Lo que necesito es que me devuelva esto pero así:

Cita:
products_id_|_products_model_|_products_image_|_pr oducts_price_|_manufacturers_id_|_manufacturers_na me_|_products_name_|_cat_name1_|_cat_id1_|_cat_nam e2_|_cat_id2
__________1_|_Auviart_________|_img_si.gif_____|_2 .9900_________|_1________________|_Abba___________ ____|_Chiquitita______|_Pop_______|_36______|_Espa ñol____|_41

Para que me devuelva los 5000 resultados reales, llevo días dandole vueltas al manual de mysql y no consigo solucionar mi problema , si puede alguien ayudarme le estaría eternamente agradecido.

Podría solucionar el problema con php, pero no es lo más eficaz ni rápido, se traduce en un trabajo extra para la web ralentizando la carga de la misma.

Última edición por gnzsoloyo; 24/05/2013 a las 09:34 Razón: SQL mal etiquetado.
  #2 (permalink)  
Antiguo 24/05/2013, 08:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 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.
  #3 (permalink)  
Antiguo 24/05/2013, 09:14
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: Combinar resultados repetidos en columnas virtuales

No te doy las gracias carnales.... por poco...jajajjaj con esto me vale
GROUP_CONCAT(CONCAT(categories_id, '-', categories_name)) categorias

por que con php proceso esa respuesta y ya no es tanta carga ni tanto trabajo el que provoco...
un gúgol de gracias leonardo

En la base de datos tengo 5000 canciones pero me devolvía 10000 registros, en categorias tengo tanto idiomas como estilos, hasta el 40 eran los estilos y a partir de ahí los idiomas, otra vez, gracias, me ahorrado mucho investigar.
  #4 (permalink)  
Antiguo 24/05/2013, 09:25
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: Combinar resultados repetidos en columnas virtuales

Se me ha quedado así al final y funciona perfectamente, muchísimas gracias otra vez.

Código MySQL:
Ver original
  1. SELECT p.products_id, p.products_model, p.products_image, p.products_price, m.manufacturers_id, m.manufacturers_name, d.products_name, GROUP_CONCAT(CONCAT(c.categories_id, '-', c.categories_name)) as categorias
  2. FROM products p
  3. LEFT JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id
  4. LEFT JOIN products_description d ON p.products_id = d.products_id
  5. AND d.language_id =3
  6. LEFT JOIN products_to_categories pc ON p.products_id = pc.products_id
  7. LEFT JOIN categories_description c ON c.categories_id = pc.categories_id
  8. AND c.language_id =3
  9. GROUP BY  p.products_id

Última edición por gnzsoloyo; 24/05/2013 a las 09:33 Razón: SQL mal etiquetado.
  #5 (permalink)  
Antiguo 24/05/2013, 09:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Combinar resultados repetidos en columnas virtuales

Hola de nuevo lambar:

Me alegra que te haya servido el código... como observación final, te diría que tengas cuidado al utilizar tantos LEFT JOIN's, pues estos pueden acarrear problemas con los resultados... No creo que todas las relaciones que tengas sean opcionales, es decir, realmente existen productos sin descripción??? o categorías sin descripción??? es conveniente que revises cuando es necesario un LEFT o RIGTH JOIN y cuando debes utilizar los INNER JOIN's...

Saludos
Leo.

Etiquetas: columnas, distinct, repetidos, resultados, virtuales
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 10:18.