Vous pouvez le faire avec substring_index()
. La requête suivante utilise la vôtre comme sous-requête, puis applique cette logique :
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
L'expression substring_index(currencies, ',' 2)
prend la liste en devises jusqu'à la seconde. Pour les somoas américains, ce serait 'US Dollar,Kwanza'
. Le prochain appel avec -1
car l'argument prend le dernier élément de la liste, qui serait 'Kwanza'
, qui est le deuxième élément de currencies
.
Notez également que les requêtes SQL renvoient un ensemble bien défini de colonnes. Une requête ne peut pas avoir un nombre variable de colonnes (sauf si vous utilisez du SQL dynamique via un prepare
déclaration).