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;

Demo