2013-11-03 104 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;' –