2011-11-30 65 views
1

我有一个MySQL数据库如下表:MySQL中,需要一个查询来检索表的多个领域一行

**EmpInfo** 

ID    Name    Address 
-------------------------------------------------------- 
10001   Rocky Silva   11, satellite street 


**EmpContact** notion (M for mobile number and L for Landline number) 

ID    Phone    Type 
-------------------------------------------------------- 
10001   909099925    M 
10001   20222525    L 

我想以这样的方式来创建一个视图,它返回我在下面单排(在笛卡尔产品后不是双排):

10001  Rocky Silva  11, satellite street 909099925  20222525 

任何人都可以帮我查询吗?我尝试过不同的连接,但没有运气;我想我失去了一些东西......

+0

你希望每个电话NBRS的在自己的列(ALA班尼斯特先生的解决方案),还是确定有一列瓦特/所有电话号码连接起来合并为一个大字符串(使用GROUP_CONCAT将提供)? –

回答

4
SELECT id, name address, GROUP_CONCAT(phone) as phones 
FROM EmpInfo 
JOIN EmpContact USING (id) 
GROUP BY id; 
0

如果您知道要组合元素的数量,你可以不喜欢以下(2):

SELECT EmpInfo.*, EC1.Phone, EC2.Phone from EmpInfo, EmpContact as EC1, EmpContact is EC2 
WHERE EmpInfo.ID = EC1.ID and EmpInfo.ID = EC2.ID and EC1.Phone < EC2.Phone 

这假定恰好有2每个ID手机

+0

对于属于一个人的电话号码的数量没有任何限制,最多可能有3或4个 – Hunt

2

尝试:

select i.ID, 
     i.Name, 
     i.Address, 
     cm.Phone as Mobile, 
     cl.Phone as Landline 
from EmpInfo i 
left join EmpContact cm on i.ID = cm.ID and cm.Type = 'M' 
left join EmpContact cl on i.ID = cl.ID and cl.Type = 'L' 
+0

将此扩展为包含每个可能类型的列,并且我认为我们有一个赢家。 –

1

尝试这一个 -

SELECT e.*, MAX(IF(ec.Type = 'M', ec.Phone, NULL)) M, MAX(IF(ec.Type = 'L', ec.Phone, NULL)) L FROM EmpInfo e 
    LEFT JOIN EmpContact ec 
    ON e.ID = ec.ID 
GROUP BY e.ID; 
1

SELECT i.id, i.name, i.address, group_concat(c.phone) 
from empInfo i, empContact c 
where c.id = i.id 
group by i.id,i.name,i.address 

使用此功能GROUP_CONCAT会给你所有的手机逗号分隔的一列。如果你想单独的列,这样做

SELECT i.id, i.name, i.address, 
GROUP_CONCAT(if (Type = 'M', phone, NULL)) AS 'Mobile', 
GROUP_CONCAT(if (Type = 'L', phone, NULL)) AS 'Landline', 
from empInfo i, empContact c 
where c.id = i.id 
group by i.id,i.name,i.address