归一化数据

时间:2014-05-08 16:55:45

标签: 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”有两个固定电话号码和一个移动电话号码。

我正在尝试检索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个传真号码。所以现在每个人有一个最大数量限制。

1 个答案:

答案 0 :(得分:0)

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