Você pode fazer isso com
substring_index()
. A consulta a seguir usa a sua como uma subconsulta e aplica essa lógica:select Name, ISOCode_2,
substring_index(currencies, ',', 1) as Currency1,
(case when numc >= 2 then substring_index(substring_index(currencies, ',', 2), ',', -1) end) as Currency2,
(case when numc >= 3 then substring_index(substring_index(currencies, ',', 3), ',', -1) end) as Currency3,
(case when numc >= 4 then substring_index(substring_index(currencies, ',', 4), ',', -1) end) as Currency4,
(case when numc >= 5 then substring_index(substring_index(currencies, ',', 5), ',', -1) end) as Currency5,
(case when numc >= 6 then substring_index(substring_index(currencies, ',', 6), ',', -1) end) as Currency6,
(case when numc >= 7 then substring_index(substring_index(currencies, ',', 7), ',', -1) end) as Currency7,
(case when numc >= 8 then substring_index(substring_index(currencies, ',', 8), ',', -1) end) as Currency8
from (SELECT country.Name, country.ISOCode_2, group_concat(currency.name) AS currencies,
count(*) as numc
FROM country
INNER JOIN countryCurrency ON country.country_id = countryCurrency.country_id
INNER JOIN currency ON currency.currency_id = countryCurrency.currency_id
GROUP BY country.name
) t
A expressão
substring_index(currencies, ',' 2)
leva a lista em moedas até a segunda. Para American Somoa, isso seria 'US Dollar,Kwanza'
. A próxima chamada com -1
pois o argumento pega o último elemento da lista, que seria 'Kwanza'
, que é o segundo elemento de currencies
. Observe também que as consultas SQL retornam um conjunto de colunas bem definido. Uma consulta não pode ter um número variável de colunas (a menos que você esteja usando SQL dinâmico por meio de um
prepare
declaração).