O método "eazy" é usar CONCAT para gerar JSON.
E use GROUP_CONCAT para combinar os vários registros de equipes em um array JSON.
Este método também funciona nas versões mais antigas do MySQL que não suportam criar funções JSON.
Consulta
SET SESSION group_concat_max_len = @@max_allowed_packet
SELECT
CONCAT(
"{"
, '"id"' , ":" , '"' , friends.id , '"' , ","
, '"name"' , ":" , '"' , friends.name , '"' , ","
, '"team"' , ":" , "["
, GROUP_CONCAT('"', teams.name, '"')
, "]"
, "}"
) AS json
FROM
friends
INNER JOIN
relations
ON
friends.id = relations.friends_id
INNER JOIN
teams
ON
relations.teams_id = teams.id
WHERE
friends.id = 1
Resultado
| json |
|-----------------------------------------------------------------|
| {"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]} |
demonstração
http://www.sqlfiddle.com/#!9/4cd244/19
Editei mais amigos
Consulta
SET SESSION group_concat_max_len = @@max_allowed_packet
SELECT
CONCAT(
"["
, GROUP_CONCAT(json_records.json) # combine json records into a string
, "]"
) AS json
FROM (
SELECT
CONCAT(
"{"
, '"id"' , ":" , '"' , friends.id , '"' , ","
, '"name"' , ":" , '"' , friends.name , '"' , ","
, '"team"' , ":" , "["
, GROUP_CONCAT('"', teams.name, '"')
, "]"
, "}"
) AS json
FROM
friends
INNER JOIN
relations
ON
friends.id = relations.friends_id
INNER JOIN
teams
ON
relations.teams_id = teams.id
WHERE
friends.id IN(SELECT id FROM friends) #select the friends you need or just simply friends.id IN(1, 2)
GROUP BY
friends.id
)
AS json_records
Resultado
| json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |
demonstração
http://www.sqlfiddle.com/#!9/4cd244/61