varios subconsulta group_concat función español ejemplos concatenar campos mysql group-concat

mysql - subconsulta - group_concat varios campos



Múltiples GROUP_CONCAT en diferentes campos usando MySQL (4)

Puede agregar solo la palabra clave DISTINCT, obtendrá los resultados deseados.

SELECT tb_mod.*, tb_van.*, GROUP_CONCAT(DISTINCT tb_voil.vt_id) AS voil, GROUP_CONCAT(DISTINCT tb_other.oa_id) AS other, GROUP_CONCAT(DISTINCT tb_ref.rp_id) AS referral FROM cp_modules_record_tbl tb_mod LEFT JOIN cp_vane_police_tbl tb_van ON tb_van.mr_id= tb_mod.id LEFT JOIN cp_mod_voilt_tbl tb_voil ON tb_voil.mr_id= tb_mod.id LEFT JOIN cp_mod_otheraction_tbl tb_other ON tb_other.mr_id= tb_mod.id LEFT JOIN cp_mod_referral_tbl tb_ref ON tb_ref.mr_id= tb_mod.id WHERE tb_mod.mod_type = 2 GROUP BY tb_mod.id

Tengo una consulta como esta:

SELECT product.id, GROUP_CONCAT(image.id) AS images_id, GROUP_CONCAT(image.title) AS images_title, GROUP_CONCAT(facet.id) AS facets_id ... GROUP BY product.id

Y la consulta funciona, pero no como se esperaba, porque si tengo un producto con 5 facetas y 1 imagen (supongamos que una imagen con id = 7), obtengo algo como esto en "images_id":
"7,7,7,7,7"
Si tengo 2 imágenes (7 y 3) entonces obtengo algo como:
"7,7,7,7,7,3,3,3,3,3"
y en facetas me sale algo como:
"8,7,6,5,4,8,7,6,5,4"

Creo que MySQL está haciendo algún tipo de unión de las diferentes filas devueltas por la consulta y luego concatenando todo.

Mi resultado esperado es (para el último ejemplo):

images_id = "7,3"
facets_id = "8,7,6,5,4"

Puedo obtener eso usando DISTINCT en el GROUP_CONCAT, pero luego tengo otro problema: si tengo dos imágenes con el mismo título, una de ellas es omitida, y luego obtengo algo como:
images_id = "7,3,5"
images_title = "Title7and3, Title5"

Así que echo de menos la relación entre images_id y images_title.

¿Alguien sabe si es posible hacer esta consulta en MySQL?

Tal vez estoy complicando todo sin ningún beneficio real. Intento ejecutar solo una consulta por rendimiento, pero ahora no estoy tan seguro de si es más rápido ejecutar dos consultas (una para seleccionar las facetas y otra para las imágenes, por ejemplo).

Explique cuál cree que es la mejor solución para esto y por qué.

Gracias !


Sólo tiene que añadir DISTINCT .

Ejemplo:
GROUP_CONCAT(DISTINCT image.id) AS images_id


Si el problema es la velocidad, entonces puede ser mucho más rápido simplemente seleccionar todos los datos que necesita como filas separadas y hacer la agrupación en la aplicación, es decir:

SELECT product.id, image.id, image.title, facet.id

Luego en la aplicación:

foreach row: push product_id onto list_of_product_ids push image_id onto list_of_image_ids etc.


Tendrá que obtener cada grupo por separado:

SELECT p.id, images_id, images_title, facets_id, ... FROM PRODUCT p JOIN (SELECT product.id, GROUP_CONCAT(image.id) AS images_id FROM PRODUCT GROUP BY product.id) a on a.id = p.id JOIN (SELECT product.id, GROUP_CONCAT(image.title) AS images_title FROM PRODUCT GROUP BY product.id) b on b.id = p.id JOIN (SELECT product.id, GROUP_CONCAT(facet.id) AS facets_id FROM PRODUCT GROUP BY product.id) b on c.id = p.id ...