mysql - 对数据进行非规范化

标签 mysql normalization pivot-table

我有三个标准化表,如下

person_info       person_phone                      phone_types
 ------------      -------------------------------     --------------
| id |  Name |    | p_id    |  typeid   | value  |   | id | type    |
|----|-------|    |---------|-----------|--------|   |----|---------|  
|  1 |  Sam  |    |  1      |     1     | 4455544|   |  1 | landline|
|  2 |  Bill |    |  1      |     1     | 889898 |   |  2 | mobile  |
|  3 |  Ted  |    |  1      |     2     | 8898999|   |  3 | fax     |
 ------------      ------------------------------     --------------

每个人可以拥有不止一部手机、固定电话或传真。在上面的示例中,“SAM”有两个固定电话号码和 1 个手机号码。

我正在尝试按如下方式检索 SAM 的数据

SELECT
    pi.id,
    pi.name,
    MAX(CASE WHEN pt.type = 'landline' THEN pp.value ELSE NULL END) AS landline,
    MAX(CASE WHEN pt.type = 'mobile' THEN pp.value ELSE NULL END) AS mobile,
    MAX(CASE WHEN pt.type = 'fax' THEN pp.value ELSE NULL END) AS fax,
FROM
    person_phone as pp
    INNER JOIN phone_types AS pt on pp.type_id=pt.id
    INNER JOIN person_info AS pi on pi.id =pp.p_id
GROUP BY pi.id;

这每次只给我最后添加的电话号码。

id       name       landline      mobile         fax
1        Sam        889898        8898999        NULL

但我希望他们输入的所有联系号码(每个人可以是“n”个固定电话/手机号码)显示为固定电话1、固定电话2、固定电话3等。

如果我的方法不对,请建议其他正确的方法。

编辑 我正在将条件从“n”更改为固定数字。任何人不得拥有超过 5 个固定电话号码、5 个手机号码和 2 个传真号码。所以现在有每人最多人数限制。

最佳答案

想到的解决方案是使用 group concat获取所有数字,并用某些内容分隔,然后让应用程序处理演示文稿。

关于mysql - 对数据进行非规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23548009/

相关文章:

c# - 电话号码标准化 : Any pre-existing libraries?

python - Pandas 数据框的简单数据透视表

sql - mysql查询将行数据动态转换为列

python - 我可以使用 Pandas 的 pivot_table 聚合缺失值的列吗?

mysql-workbench 未启动。加载共享库时出错 : libmysqlclient. so.18

mysql - 无法在 fedora 21 机器上安装 scrypt gem

python - 尝试规范化 Python 图像时出现错误 - RGB 值必须在 0..1 范围内

python - 按条件标准化条件单变量seaborn

mysql - 根据业务 X 周和 X 计数后,录音标记为删除

php - 如何使用动态复选框?