MySQL select specific row values as column names

后端 未结 1 1246
忘掉有多难
忘掉有多难 2021-01-16 10:52

Here is my basic participants table (displayed as associative array):

[id] => 1
[campaign_id] => 41
[firstname] => Jeff
[lastname] =>         


        
相关标签:
1条回答
  • 2021-01-16 11:05
    SELECT  a.ID,
            a.Campaign_ID,
            a.FirstName,
            a.LastName,
            MAX(CASE WHEN b.data = 'qwerty1' THEN b.Name END) qwerty1,
            MAX(CASE WHEN b.data = 'qwerty2' THEN b.Name END) qwerty2,
            MAX(CASE WHEN b.data = 'qwerty3' THEN b.Name END) qwerty3
    FROM    Participants a
            INNER JOIN Participants_Custom b
                ON a.ID = b.Participant_ID
    GROUP   BY  a.ID,
                a.Campaign_ID,
                a.FirstName,
                a.LastName
    
    • SQLFiddle Demo

    UPDATE 1

    Since the values of data are unknown, a dynamic sql is much preferred.

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(CASE WHEN b.data = ''',
          data,
          ''' THEN b.Name ELSE NULL END) AS ',
          CONCAT('`',data, '`')
        )
      ) INTO @sql
    FROM Participants_Custom;
    
    SET @sql = CONCAT('SELECT  a.ID,
                               a.Campaign_ID,
                               a.FirstName,
                               a.LastName,', @sql, 
                      'FROM     Participants a
                                INNER JOIN Participants_Custom b
                                    ON a.ID = b.Participant_ID
                        GROUP   BY  a.ID,
                                    a.Campaign_ID,
                                    a.FirstName,
                                    a.LastName');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    • SQLFiddle Demo
    0 讨论(0)
提交回复
热议问题