2014-05-08 72 views
0

我有三个标准化表如下进行非标准化的数据

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”为每个人固定电话/手机号码数)显示为landline1,landline2,landline3等。

如果我的方法错了,请推荐一些其他正确的方法。

编辑 我将条件从'n'更改为固定数字。任何人都不能有超过5个固定电话,5个移动电话和2个传真号码。所以现在每个人都有一个最大数量限制。

回答

0

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

+0

GROUP_CONCAT的作品,但是我的数据库结构是否正确?我可以继续这个设计吗? 我使用GROUP_CONCAT更改了MAX,并且能够以逗号分隔的方式获取数据。 同样的方式,我会像这样将人的兴趣和其他一些表分组在一起。这会影响处理速度吗? – harishannam

+0

我觉得很好。一旦获得大量数据,解除归一化可为您节省一些时间。其他产品,如Cassandra,完全围绕非规范化而不加入的概念构建。 –

+0

我的应用程序将有大约25000人的数据与他们的联系号码。 我应该担心迁移到Cassandra吗? – harishannam