将表连接在一起,为外部链接创建新列

时间:2012-11-01 16:12:51

标签: mysql join

  

可能重复:
  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    |
|__________|_________________|___________|___________|___________|

这可能吗?

1 个答案:

答案 0 :(得分: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;