Pedindo em um mysql group_concat com uma função
-
21-09-2019 - |
Pergunta
Quero solicitar os resultados em uma função group_concat. O problema é que a seleção no grupo_CONCAT-FUNCTION é outra função, como esta (Fantasy Select):
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
Eu quero obter um resultado como (encomendado por B.id):
michael 1:science,2:maths,3:physics
Mas eu entendo:
michael 2:maths,1:science,3:physics
Alguém sabe como posso encomendar por B.id no meu grupo_concat aqui?
Solução
Se alguém se importa, acho que encontrei uma solução para pelo menos um problema semelhante.
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
O pedido por se passa no group_concat antes do separador, se houver um.
Outras dicas
Eu sei que isso é muito velho, mas agora eu estava procurando uma resposta e a resposta de @Korny me deu a ideia para isso:
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
(E funciona para mim, se isso não estava claro :-))
Não conheço uma maneira padrão de fazer isso. Esta consulta funciona, mas receio que dependa apenas de alguns detalhes de implementação:
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
Não há necessidade de subseletos.
SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data
FROM people, stuff, courses
ORDER BY stuff.id, people.name
SELECT pub_id,GROUP_CONCAT(DISTINCT cate_id)
FROM book_mast
GROUP BY pub_id
ORDER BY GROUP_CONCAT(DISTINCT cate_id) ASC;
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