当前位置: 首页 > 面试题库 >

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

张昊穹
2023-03-14
问题内容

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

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

在另一个名为的表上,participants_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

我目前正在制作join,但它只会增加nameparticipant_iddata给我行。我想要的是我的查询返回如下内容:

[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


  • SQLFiddle演示

更新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;
  • SQLFiddle演示


 类似资料:
  • 问题内容: 我有一个旧的用户信息表(仍在使用中),并且不能更改- 时区/语言/国家等只是名称的示例,它们可以是可变的/除了该列的行上的唯一列表外,没有其他任何有限列表 我需要一个MySQL兼容的SQL查询,该查询将返回- 我已经研究了关于将数据透视表功能窃取到MySQL的关于stackoverflow的各种答案,类似的方法,但是似乎没有一个比从相同表的列的唯一行值使用变量列名别名的情况更好。尽管我

  • 问题内容: 我遇到一个问题,当我尝试选择某个列的值为NULL的行时,它将返回一个空集。但是,当我查看phpMyAdmin中的表时,对于大多数行,它表示为null。 我的查询看起来像这样: 每次都清空。 据说有很多地方都确保不会将其存储为“ NULL”或“ null”,而不是实际值,还有一个地方试图仅查找空格(),但没有一个起作用。有人建议不要使用MyISAM并使用innoDB,因为MyISAM无法

  • 问题内容: 我有一个看起来像这样的mysql表: 我希望能够查询得到多行,每一列一个。例如: 这会给我: 我需要用什么来制定这样的查询? 问题答案: 您必须首先将每个指定字段的数据应用于结果。 询问 签 出 SQLFIDDLE

  • 我创建了一个DataFrame,如下所示,我想对列标题应用映射减少算法,但是当我使用减少键函数时,我遇到了一些问题。 我试过这个,但不管用: 似乎我应该先将数据帧转移到列表中,然后使用映射函数生成键值对(word,1),最后求和键值。i一种从stackoverflow将数据框转移到列表的方法,例如 但是出现了一个错误

  • 问题内容: 我有一个用于“个人档案”的表,以行样式存储个人档案属性值,例如: 和另一个用于属性定义的表: 如何使用或以任何其他方式以这种方式显示它: 问题答案: 不用关键字就可以轻松完成此操作,只需将其分组即可 您也可以使用关键字执行此操作

  • 问题内容: 理想情况下,我需要一个等于 但这是非法的。 我不能使用自动递增的字段。 row_number()是需要选择的行。 我该怎么办? 编辑:嗯,我使用iSql * plus进行练习,出于某些原因,使用limit和auto_increment是非法的。我最终创建了一个序列和一个触发器,并且每次输入一个条目时,ID都增加了1。 问题答案: 您可以使用代替。 如文档所述, 第一个参数指定要返回的第