Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择特定的行值作为列名_Mysql_Sql_Pivot - Fatal编程技术网

MySQL选择特定的行值作为列名

MySQL选择特定的行值作为列名,mysql,sql,pivot,Mysql,Sql,Pivot,这是我的基本参与者表(显示为关联数组): 在另一个名为participants\u custom的表中,我可以添加属于participants行的多个自定义数据。像这样: [id] => 51 [participant_id] => 1 [name] => textfield_bh423vjhgv [data] => qwerty1 [id] => 52 [participant_id] => 1 [name] => textfield_IDRr2kz

这是我的基本
参与者
表(显示为关联数组):

在另一个名为
participants\u custom
的表中,我可以添加属于
participants
行的多个自定义数据。像这样:

[id] => 51
[participant_id] => 1
[name] => textfield_bh423vjhgv
[data] => qwerty1

[id] => 52
[participant_id] => 1
[name] => textfield_IDRr2kzjZR59Xjw
[data] => qwerty2

[id] => 53
[participant_id] => 1
[name] => textfield_6kj5bhjjg
[data] => qwerty3
我目前正在创建一个
加入
,但它只将
名称
参与者id
数据
添加到我的行中。我希望我的查询返回如下内容:

[id] => 1
[campaign_id] => 41
[firstname] => Jeff
[lastname] => Berube
[textfield_bh423vjhgv] => qwerty1
[textfield_IDRr2kzjZR59Xjw] => qwerty2
[textfield_6kj5bhjjg] => qwerty3
行值
name
变为列,
value
变为值我该怎么做?

我找到了,但没有成功。我正在寻找一种适合我的情况的方法。谢谢你的帮助

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
更新1

由于
data
的值未知,因此更倾向于使用动态sql

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;

但是b.数据可以是任何东西,不仅仅是qwerty1、query2或qwerty3。如何判断b.Name中的值是否必须成为列,并将
作为其值?并且
参与者自定义
中的行数是可变的,大部分时间在0到6之间。然后需要动态sql,请稍候
:D
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;