【问题标题】:MySQL mapping within a list [duplicate]列表中的MySQL映射[重复]
【发布时间】:2020-12-02 07:17:33
【问题描述】:

我有一些以逗号分隔的国家代码值,我如何返回它们对应的映射值(例如下面我的示例中的 ccy)?

| country    | ccy           |
+------------+---------------+
| HK         | HKD           |
| JP         | JPY           |
| JP, KR     | JPY, KRW      |
| AU, NZ     | AUD, NZD      |
| US, UK, EU | USD, GBP, EUR |

单个映射存储在单独的表 data_mapping 中:

| country | ccy |
+---------+-----+
| HK      | HKD |
| JP      | JPY |
| KR      | KRW |
| AU      | AUD |
| NZ      | NZD |
| US      | USD |
| UK      | GBP |
| EU      | EUR |

基本上我需要一个返回 ccy_list 的函数 f_ccy(country_list),它将拆分、查找并合并回一个列表

可行吗?

【问题讨论】:

  • 虽然“这不是您应该如何设计数据库”的答案是非常正确的,但这是可行的。见dbfiddle.uk/…

标签: mysql list split lookup


【解决方案1】:

我只是在这里直接回答说您绝对应该远离将 CSV 存储在 SQL 表中。请改用此版本:

| 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   |

现在有了这个适当的表设计,您只需要一个基本的聚合连接:

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

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 2017-01-28
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多