首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用`group_concat`和` `group `透视表

使用`group_concat`和` `group `透视表
EN

Stack Overflow用户
提问于 2017-04-21 05:46:21
回答 1查看 1.5K关注 0票数 0

我有一个关于问题和答案的表,其中有两个相关的列和ID。问题的答案可以是数字或字母数字,如下所示:

代码语言:javascript
复制
╔══════════╦═════════════╦═══════════╦═════════╗
║ visit_id ║ visit_child ║ question  ║ answer  ║
╠══════════╬═════════════╬═══════════╬═════════╣
║   121340 ║      104280 ║ How much? ║ 3       ║
║   121340 ║      104280 ║ How many? ║ 2       ║
║   121340 ║      104280 ║ Why?      ║ Because ║
║   121340 ║      104280 ║ Really?   ║ Yup     ║
║   121485 ║      114190 ║ How much? ║ 5       ║
║   121485 ║      114190 ║ How many? ║ 6       ║
║   121485 ║      114190 ║ Why?      ║ Why not ║
║   121485 ║      114190 ║ Really?   ║ Sure    ║
╚══════════╩═════════════╩═══════════╩═════════╝

我想要旋转这些信息,这样问题就会变成列,给定的答案就会放在合适的位置。我正在寻找的结果如下所示:

代码语言:javascript
复制
╔══════════╦═════════════╦═══════════╦═══════════╦═════════╦═════════╗
║ visit_id ║ visit_child ║ How much? ║ How many? ║  Why?   ║ Really? ║
╠══════════╬═════════════╬═══════════╬═══════════╬═════════╬═════════╣
║   121340 ║      104280 ║         3 ║         2 ║ Because ║ Yup     ║
║   121485 ║      114190 ║         5 ║         6 ║ Why not ║ Sure    ║
╚══════════╩═════════════╩═══════════╩═══════════╩═════════╩═════════╝

我已经做了我的家庭作业,并阅读了几个MySQL教程中的Howto pivot,我带来了以下内容:

代码语言:javascript
复制
SELECT
    infoBase.visit_id,
    infoBase.visit_child,
    GROUP_CONCAT(DISTINCT
        CONCAT('MAX(IF(infoBase.question = \'',question,'\', \'',answer,'\', 0)) AS \'',question,'\'',''), "\n"
    )
FROM    
  visits vi,
  infoBase
WHERE
  vi.id = infoBase.visit_child
GROUP BY
  infoBase.visit_id, infoBase.visit_child

我得到的结果如下:

代码语言:javascript
复制
╔══════════╦═════════════╦════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ visit_id ║ visit_child ║                                                               GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(infoBase.question = \'',question,'\', \'',answer,'\', 0)) AS \'',question,'\'',''), "\n")                                                               ║
╠══════════╬═════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║   121340 ║      104280 ║ MAX(IF(infoBase.question = 'How much?', '3', 0)) AS 'How much?',MAX(IF(infoBase.question = 'How many?', '2', 0)) AS 'How many?',MAX(IF(infoBase.question = 'Why?', 'Because', 0)) AS 'Why?',MAX(IF(infoBase.question = 'Really?', 'Yup', 0)) AS 'Really?'  ║
║   121485 ║      114190 ║ MAX(IF(infoBase.question = 'How much?', '5', 0)) AS 'How much?',MAX(IF(infoBase.question = 'How many?', '6', 0)) AS 'How many?',MAX(IF(infoBase.question = 'Why?', 'Why not', 0)) AS 'Why?',MAX(IF(infoBase.question = 'Really?', 'Sure', 0)) AS 'Really?' ║
╚══════════╩═════════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

group_concat检索到的结果是正确的,但我想,假设将该字符串“转换”为真正的列。这必须尽可能动态地完成,因为在实际的表中,我不知道问题的确切数量和它们是什么,所以我不能在许多group_concat中对问题进行硬编码。我做错了什么??

谢谢!

附注:这是对一个更大的查询的过度简化。如果在出现新问题时需要添加更多信息,我会添加的。

EN

回答 1

Stack Overflow用户

发布于 2017-04-21 05:53:52

尝试这样的查询。这是未经测试的!

代码语言:javascript
复制
SELECT
    infoBase.visit_id,
    infoBase.visit_child,
    GROUP_CONCAT(IF(question = 'How much?', answer ,'') SEPARATOR '' ) AS 'How much?' ,
    GROUP_CONCAT(IF(question = 'How many?', answer ,'') SEPARATOR '' ) AS 'How many?' ,
    GROUP_CONCAT(IF(question = 'Why?',      answer ,'') SEPARATOR '' ) AS 'Why?' ,
    GROUP_CONCAT(IF(question = 'Really?',   answer ,'') SEPARATOR '' ) AS 'Really?'
    )
FROM    
  visits vi,
  infoBase
WHERE
  vi.id = infoBase.visit_child
GROUP BY
  infoBase.visit_id;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43530474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档