Usando MySQL
, eu posso fazer algo como:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Minha saída:
shopping
fishing
coding
mas eu só quero 1 linha, 1 col:
Saída esperada:
shopping, fishing, coding
O motivo é que estou selecionando vários valores de várias tabelas e, depois de todas as associações, tenho muito mais linhas do que gostaria.
Procurei uma função no MySQL Doc e ela não parece com as funções CONCAT
ou CONCAT_WS
aceita conjuntos de resultados.
Então, alguém aqui sabe como fazer isso?
mysql
sql
concat
group-concat
Dean Rather
fonte
fonte
Respostas:
Você pode usar
GROUP_CONCAT
:Como Ludwig afirmou em seu comentário, você pode adicionar o
DISTINCT
operador para evitar duplicatas:Como Jan afirmou em seu comentário, você também pode classificar os valores antes de implodi-lo usando
ORDER BY
:Como Dag afirmou em seu comentário, há um limite de 1024 bytes no resultado. Para resolver isso, execute esta consulta antes de sua consulta:
Claro, você pode mudar de
2048
acordo com suas necessidades. Para calcular e atribuir o valor:fonte
DISTINCT
parâmetro, você não receberá duplos.... GROUP_CONCAT(DISTINCT hobbies)
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Veja
GROUP_CONCAT
se a sua versão do MySQL (4.1) é compatível. Veja a documentação para mais detalhes.Seria algo como:
fonte
group by 'all'
não é necessário (além disso indesejável), porque isso atribui a todas as linhas de seqüência de caracteresall
e, em seguida, compara as seqüências de caracteres entre essas linhas. Estou certo?Sintaxe alternativa para concatenar várias linhas individuais
AVISO: Este post deixará você com fome.
Dado:
Eu me vi querendo selecionar várias linhas individuais - em vez de um grupo - e concatenar em um determinado campo.
Digamos que você tenha uma tabela de IDs de produtos, seus nomes e preços:
Então você tem um ajax sofisticado que lista esses filhotes como caixas de seleção.
Seu usuário de hipopótamo com fome seleciona
13, 15, 16
. Hoje não há sobremesa para ela ...Encontrar:
Uma maneira de resumir a ordem do usuário em uma linha, com o mysql puro.
Solução:
Use
GROUP_CONCAT
com aIN
cláusula the :Quais saídas:
Solução bônus:
Se você também quiser o preço total, jogue
SUM()
:PS: Desculpas se você não tiver um In-N-Out por perto ...
fonte
Você pode alterar o comprimento máximo do
GROUP_CONCAT
valor configurando ogroup_concat_max_len
parâmetroVeja detalhes na documentação do MySQL .
fonte
Há uma função agregada GROUP, GROUP_CONCAT .
fonte
No meu caso, eu tinha uma linha de IDs e era necessário convertê-la em char, caso contrário, o resultado foi codificado em formato binário:
fonte
CAST
eu tinha valores como[BLOB - 14 Bytes]
no resultado!Use a variável de sessão MySQL (5.6.13) e o operador de atribuição como os seguintes
então você pode obter
fonte
SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Eu tive uma consulta mais complicada e descobri que precisava usar
GROUP_CONCAT
em uma consulta externa para fazê-la funcionar:Consulta original:
Imploded:
Espero que isso possa ajudar alguém.
fonte
Para alguém olhando aqui como usar
GROUP_CONCAT
com subconsulta - postando este exemploPortanto,
GROUP_CONCAT
deve ser usado dentro da subconsulta, não envolvendo-a.fonte
Tente o seguinte:
fonte
nós temos duas maneiras de concatenar colunas no MySql
Ou
fonte