7

我搜索了很多,但没有找到解决我问题的合适方法。

我想做什么?

我在 MySQL 中有 2 个表: - 国家 - 货币(我通过 CountryCurrency 将它们连接在一起 --> 由于多对多关系)

请参阅此示例以获取工作示例:http ://sqlfiddle.com/#!2/317d3/8/0

我想使用连接将两个表链接在一起,但我想每个国家只显示一行(有些国家有多种货币,所以这是第一个问题)。

我找到了 group_concat 函数:

SELECT country.Name, country.ISOCode_2, group_concat(currency.name) AS currency
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

这有以下结果:

NAME            ISOCODE_2   CURRENCY

Afghanistan AF          Afghani
Åland Islands   AX          Euro
Albania         AL          Lek
Algeria         DZ          Algerian Dinar
American Samoa  AS          US Dollar,Kwanza,East Caribbean Dollar

但我现在想要的是将货币拆分为不同的列(货币 1、货币 2、...)。我已经尝试过 MAKE_SET() 之类的函数,但这不起作用。

4

3 回答 3

6

您可以使用substring_index(). 以下查询将您的查询用作子查询,然后应用此逻辑:

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

该表达式substring_index(currencies, ',' 2)以货币表示列表,直到第二个。对于美属索摩亚,那将是'US Dollar,Kwanza'。以作为参数的下一个调用采用-1列表的最后一个元素,即'Kwanza',它是 的第二个元素currencies

另请注意,SQL 查询返回一组定义明确的列。查询不能有可变数量的列(除非您通过prepare语句使用动态 SQL)。

于 2013-07-24T14:17:36.697 回答
1

使用此查询计算您需要的货币列数:

SELECT MAX(c) FROM 
((SELECT count(currency.name) AS c
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) as t)

然后动态创建并执行准备好的语句以生成结果,在这个线程中使用上面查询结果的 Gordon Linoff 解决方案。

于 2017-07-12T21:42:34.177 回答
-2

Ypu可以使用动态SQL,但是你必须使用procedure

于 2013-07-24T14:20:04.217 回答