Pivot Table Using MySQL

后端 未结 1 502
逝去的感伤
逝去的感伤 2020-12-09 14:17

I have two tables Triples and Tags

Triples Table has the following Columns

  id  PostID  TagID   Value
   1   1        1     Murder
   2   1        2         


        
相关标签:
1条回答
  • 2020-12-09 14:51

    In order to pivot the data in MySQL, you will need to use both an aggregate function and a CASE expression.

    If you have a known number of columns, then you can hard-code the query:

    select p.postid,
      max(case when t.tagname = 'Incident' then p.value end) Incident,
      max(case when t.tagname = 'Location' then p.value end) Location,
      max(case when t.tagname = 'Weapon' then p.value end) Weapon
    from triples p
    left join tags t
      on p.tagid = t.id
    group by p.postid;
    

    See SQL Fiddle with Demo

    But if you have an unknown number of columns, then you will need to use a prepared statement to generate dynamic SQL:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(CASE WHEN TagName = ''',
          TagName,
          ''' THEN p.value END) AS `',
          TagName, '`'
        )
      ) INTO @sql
    FROM tags;
    
    
    SET @sql 
      = CONCAT('SELECT p.postid, ', @sql, ' 
               from triples p
               left join tags t
                 on p.tagid = t.id
               group by p.postid');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    See SQL Fiddle with Demo.

    Both will give the result:

    | POSTID | INCIDENT |      LOCATION | WEAPON |
    ----------------------------------------------
    |      1 |   Murder | New Brunswick | (null) |
    |      2 |    Theft |        (null) |    Gun |
    
    0 讨论(0)
提交回复
热议问题