我有一个关于具有ID的两个相关列的问题和答案的表格。对这些问题的回答可以是数字或字母数字这样的:使用`group_concat`和`group by`旋转表格
╔══════════╦═════════════╦═══════════╦═════════╗
║ 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 ║
╚══════════╩═════════════╩═══════════╩═════════╝
我想这样的问题,成为列转动此信息,并给出答案得到妥善安置。我正在寻找类似下面这样的结果:
╔══════════╦═════════════╦═══════════╦═══════════╦═════════╦═════════╗
║ 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支点和我来到这个:
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
我能得到什么如下:
╔══════════╦═════════════╦════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ 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
检索的结果是正确的,但我想,让我们说“转换”该字符串real列。 这必须尽可能动态地完成,因为在真正的表格中,我不知道问题的确切数量和它们是什么,所以我不能在许多group_concat
中硬编码问题。 我在做什么错?
谢谢!
P.S.这在一个更大的查询过度简化。如果在出现新问题时需要添加更多信息,我会添加它。
[用动态列的MySQL透视表查询]的可能的复制(http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns) – shmosel
@shmosel似乎相似是的,我以前没有看到过这个问题。我会尽力理解那里的答案。谢谢。 – Metafaniel
[_Here's_](http://mysql.rjweb.org/doc.php/pivot)如何动态生成查询。把它存入一个存储过程,然后准备并执行它。 “调用”这个过程将在“一步”中完成。 –