2012-11-01 35 views
1
創建新列

可能重複:
Pivot Table With 3 tables表連接在一起,對外國鏈接

編輯:對不起,我列一個錯誤

我有下表:

_______________________________________ 
| ItemID | ItemName | ItemDescription | 
|________|__________|_________________| 
| 1 | Alice |  Foo  | 
|________|__________|_________________| 
| 2 | Bob |  Bar  | 
|________|__________|_________________| 

________________________ 
| LinkID | LinkAddress | 
|________|_____________| 
| 1 | www.c.com | 
|________|_____________| 
| 2 | www.b.com | 
|________|_____________| 
| 3 | www.a.com | 
|________|_____________| 

________________________________________ 
| AssocID | ItemID | LinkID | LinkType | 
|_________|________|________|__________| 
| 1 | 1 | 3 | Youtube | 
|_________|________|________|__________| 
| 2 | 2 | 2 | Facebook | 
|_________|________|________|__________| 
| 3 | 2 | 1 | Twitter | 
|_________|________|________|__________| 

我想獲得一個SQL查詢來創建這樣一個結果:

__________________________________________________________________ 
| ItemName | ItemDescription | Youtube | Facebook | Twitter | 
|__________|_________________|___________|___________|___________| 
| Alice |  Foo  | NULL | NULL | www.a.com | 
|__________|_________________|___________|___________|___________| 
| Bob |  Bar  | www.c.com | www.b.com | NULL | 
|__________|_________________|___________|___________|___________| 

這可能嗎?

回答

2
SELECT a.ItemName, a.ItemDescription, 
     MAX(CASE WHEN b.LinkType = 'Youtube' THEN c.LinkAddress ELSE NULL END) youtube, 
     MAX(CASE WHEN b.LinkType = 'Facebook' THEN c.LinkAddress ELSE NULL END) Facebook, 
     MAX(CASE WHEN b.LinkType = 'Twitter' THEN c.LinkAddress ELSE NULL END) Twitter 
FROM tableName a 
     LEFT JOIN tableAssco b 
      ON a.ItemID = b.ItemID 
     LEFT JOIN tableLinks c 
      ON b.LinkID = c.LinkID 
GROUP BY a.ItemName, a.ItemDescription 

或使用Prepared Statements

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN b.LinkType = ''', 
     LinkType, 
     ''' then c.LinkAddress ELSE NULL end) AS ', 
     LinkType 
    ) 
) INTO @sql 
FROM tableAssco; 

SET @sql = CONCAT('SELECT a.ItemName, a.ItemDescription, ', @sql, ' 
        FROM tableName a 
          LEFT JOIN tableAssco b 
           ON a.ItemID = b.ItemID 
          LEFT JOIN tableLinks c 
           ON b.LinkID = c.LinkID 
        GROUP BY a.ItemName, a.ItemDescription'); 

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

看起來很完美,但我有個e列不正確,對不起 – topherg

+0

@cgoddard看到我更新的答案。 –

+0

如果我想爲它添加一個WHERE語句,比如'WHERE Facebook NOT NULL',我該怎麼做?我已經嘗試過,但它說'臉譜'是一個未知的列 – topherg