ejemplos - mysql group_concat distinct
Ordenar en un MySQL GROUP_CONCAT con una función en él (6)
Quiero ordenar los resultados en una función GROUP_CONCAT. El problema es que la selección en la función GROUP_CONCAT es otra función, como esta (selección de fantasía):
SELECT a.name,
GROUP_CONCAT(DISTINCT CONCAT_WS('':'', b.id, c.name) ORDER BY b.id ASC) AS course
FROM people a, stuff b, courses c
GROUP BY a.id
Quiero obtener un resultado como (ordenado por b.id):
michael 1:science,2:maths,3:physics
pero me sale
michael 2:maths,1:science,3:physics
¿Alguien sabe cómo puedo ordenar por b.id en mi group_concat aquí?
No conozco una forma estándar de hacer esto. Esta consulta funciona, pero me temo que solo depende de algunos detalles de la implementación:
SELECT a_name, group_concat(b_id)
FROM (
SELECT a.name AS a_name, b.id AS b_id
FROM tbl1 a, tbl2 b
ORDER BY a.name, b.id) a
GROUP BY a_name
No hay necesidad de subseleccionar.
SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data
FROM people, stuff, courses
ORDER BY stuff.id, people.name
Sé que esto es muy viejo, pero justo ahora estaba buscando una respuesta y la respuesta de @korny me dio la idea de esto:
SELECT a.name,
GROUP_CONCAT(DISTINCT CONCAT_WS('':'', b.id, c.name)
ORDER BY CONCAT_WS('':'', b.id, c.name) ASC) AS course
FROM people a, stuff b, courses c
GROUP BY a.id
(Y funciona para mí, si eso no estuviera claro :-))
Si a alguien le importa, creo que encontré una solución para al menos un problema similar.
http://mahmudahsan.wordpress.com/2008/08/27/mysql-the-group_concat-function/
select GROUP_CONCAT(columnName order by someColumn SEPARATOR ''|'') from tableName where fieldId = p.id
El orden va en el group_concat ANTES del separador si hay uno.
SELECT generated.name, GROUP_CONCAT(generated.data)
FROM (
SELECT people.name, CONCAST_WS(":", stuff.id, courses.name) data
FROM people, stuff, courses
ORDER BY stuff.id, people.name
) generated
GROUP BY generated.name
SELECT pub_id,GROUP_CONCAT(DISTINCT cate_id)
FROM book_mast
GROUP BY pub_id
ORDER BY GROUP_CONCAT(DISTINCT cate_id) ASC;