我有三个标准化表,如下
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/