2013-11-03 105 views
0

我有两个虚表:MySQL的加入两个表为一个

1. 人民

id, age 
1, 25 

2. 名称

id, people_id, type, value 
1, 1, 'first', 'John' 
2, 1, 'last', 'Doe' 

我如何加入两个表,所以我'd得到这个结果:

id, age, first, last 
1, 25, 'John', 'Doe' 

回答

3
SELECT a.ID, 
     a.Age, 
     MAX(CASE WHEN b.type = 'first' THEN b.Value END) `First`, 
     MAX(CASE WHEN b.type = 'last' THEN b.Value END) `Last` 
FROM People a 
     LEFT JOIN Names b 
      ON a.ID = b.people_id 
GROUP BY a.ID, a.Age 

否则,如果您有type列未知值,动态声明更加优选。

SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('MAX(CASE WHEN b.type = ''', 
       type, 
       ''' THEN value ELSE NULL END) AS ', 
       CONCAT('`', type, '`') 
       )) INTO @sql 
FROM Names; 

SET @sql = CONCAT('SELECT a.ID, 
          a.Age, ', @sql , ' 
        FROM People a 
          LEFT JOIN Names b 
           ON a.ID = b.people_id 
        GROUP BY a.ID, a.Age'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

大答案+1。 – rekire

+0

我试图避免的是不得不两次将姓名表连接到人员表。是第一个例子,我应该明确使用,而不是双连接? – unska

+0

双连接在哪里? –

0

您正在寻找如何加入来自不同表的数据的一般信息。它被称为内连接。 参考可以发现here

0

希望它可以帮助你,

方法:1

select p.id, p.age, n.type as first, n.value as last from People as p, Names as n where p.id = n.people_id 

方法:2

select p.id, p.age, n.type as first, n.value as last from People as p LEFT JOIN Names as n ON p.id = n.people_id 
+0

名称表中没有第一列或最后一列。 – unska

0
SELECT p.id, p.age, n.first, n.last 
FROM People p 
JOIN Names n 
ON p.id = n.people_id; 
+0

名称表中没有第一列或最后一列。 – unska

+0

'select p.id,(从名称n1中选择类型,其中p.id = n1.people_id和n1.type ='first'), (从名称n2中选择类型WHERE p.id = n2.people_id和n2.type ='最后')来自人员p;' –