MySQL 列表中的映射
MySQL mapping within a list
我有一些用逗号分隔的国家代码值,我如何return它们对应的映射值(例如下面示例中的 ccy)?
| country | ccy |
+------------+---------------+
| HK | HKD |
| JP | JPY |
| JP, KR | JPY, KRW |
| AU, NZ | AUD, NZD |
| US, UK, EU | USD, GBP, EUR |
单独的映射存储在单独的 table data_mapping:
| country | ccy |
+---------+-----+
| HK | HKD |
| JP | JPY |
| KR | KRW |
| AU | AUD |
| NZ | NZD |
| US | USD |
| UK | GBP |
| EU | EUR |
基本上我需要一个带有 ccy_list returned 的函数 f_ccy(country_list),它将拆分、查找并合并回列表
可行吗?
我只是在这里直接回答,您绝对应该停止在 SQL table 中存储 CSV。请改用此版本:
| country | grp | pos |
+---------+-----+-----+
| HK | 1 | 1 |
| JP | 2 | 1 |
| JP | 3 | 1 |
| KR | 3 | 2 |
| AU | 4 | 1 |
| NZ | 4 | 2 |
| US | 5 | 1 |
| UK | 5 | 2 |
| EU | 5 | 3 |
现在有了这个正确的 table 设计,您只需要一个基本的聚合连接:
SELECT
t.grp,
GROUP_CONCAT(t.country ORDER BY t.pos SEPARATOR ', ') AS country,
GROUP_CONCAT(m.ccy ORDER BY t.pos SEPARATOR ', ') AS ccy
FROM yourTable t
INNER JOIN mapping m
ON m.country = t.country
GROUP BY
t.grp;
我有一些用逗号分隔的国家代码值,我如何return它们对应的映射值(例如下面示例中的 ccy)?
| country | ccy |
+------------+---------------+
| HK | HKD |
| JP | JPY |
| JP, KR | JPY, KRW |
| AU, NZ | AUD, NZD |
| US, UK, EU | USD, GBP, EUR |
单独的映射存储在单独的 table data_mapping:
| country | ccy |
+---------+-----+
| HK | HKD |
| JP | JPY |
| KR | KRW |
| AU | AUD |
| NZ | NZD |
| US | USD |
| UK | GBP |
| EU | EUR |
基本上我需要一个带有 ccy_list returned 的函数 f_ccy(country_list),它将拆分、查找并合并回列表
可行吗?
我只是在这里直接回答,您绝对应该停止在 SQL table 中存储 CSV。请改用此版本:
| country | grp | pos |
+---------+-----+-----+
| HK | 1 | 1 |
| JP | 2 | 1 |
| JP | 3 | 1 |
| KR | 3 | 2 |
| AU | 4 | 1 |
| NZ | 4 | 2 |
| US | 5 | 1 |
| UK | 5 | 2 |
| EU | 5 | 3 |
现在有了这个正确的 table 设计,您只需要一个基本的聚合连接:
SELECT
t.grp,
GROUP_CONCAT(t.country ORDER BY t.pos SEPARATOR ', ') AS country,
GROUP_CONCAT(m.ccy ORDER BY t.pos SEPARATOR ', ') AS ccy
FROM yourTable t
INNER JOIN mapping m
ON m.country = t.country
GROUP BY
t.grp;