我有三个标准化表格如下
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个传真号码。所以现在每个人有一个最大数量限制。