在mysql中行的列

Posted

技术标签:

【中文标题】在mysql中行的列【英文标题】:columns to row in mysql 【发布时间】:2012-12-16 20:57:34 【问题描述】:

我需要帮助才能从反馈表中收集数据。

我有这样的桌子

tbl_parent_child_details

fld_parent_id   fld_parent_name  fld_child_name   fld_class   fld_section
1               Tom              Ray               8          A
2               Dev              angelina         12          B 

tbl_feedback_children

fld_parent_id  fld_quetion_id   fld_ans 
1              1                1
1              2                3
1              3                2
2              1                4
2              2                5
2              3                2

tbl_feedback_admini

fld_parent_id  fld_quetion_id   fld_ans 
1              1                1
1              2                3
1              3                2
2              1                4
2              2                5
2              3                2

现在我的要求是我想要一行中每个父母的数据,例如:

Parent child q1 q2 q3 q4 q5 q6
tom ray 1 3 2 1 3 2
dev angelina 4 5 2 4 5 2

非常感谢任何帮助。

【问题讨论】:

您应该使用高级语言在表示层上执行此操作。 SQL 不会格式化您的数据。它只是提供数据。 ***.com/questions/1851781/…的可能重复 【参考方案1】:

这种类型的操作称为 PIVOT,但 mysql 没有数据透视函数,因此您可以使用带有 CASE 语句的聚合函数来复制它。

您的查询将与此类似:

select pc.fld_parent_name,
  pc.fld_child_name,
  max(case when a.fld_quetion_id = 1 then a.fld_ans end) q1,
  max(case when a.fld_quetion_id = 2 then a.fld_ans end) q2,
  max(case when a.fld_quetion_id = 3 then a.fld_ans end) q3
from tbl_parent_child_details pc
left join tbl_feedback_admini a
  on pc.fld_parent_id = a.fld_parent_id
left join tbl_feedback_children c
  on pc.fld_parent_id = c.fld_parent_id
  and a.fld_quetion_id = c.fld_quetion_id
group by pc.fld_parent_name, pc.fld_child_name

见SQL Fiddle with Demo。

如果您有已知数量的要转换的问题,上述方法效果很好。如果您有未知号码,那么您可以使用类似这样的准备好的语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when a.fld_quetion_id = ''',
      fld_quetion_id,
      ''' then a.fld_ans end) AS q',
      fld_quetion_id
    )
  ) INTO @sql
FROM tbl_feedback_admini;

SET @sql = CONCAT('SELECT pc.fld_parent_name, 
                    pc.fld_child_name, ', @sql, ' 
                  from tbl_parent_child_details pc
                  left join tbl_feedback_admini a
                    on pc.fld_parent_id = a.fld_parent_id
                  left join tbl_feedback_children c
                    on pc.fld_parent_id = c.fld_parent_id
                    and a.fld_quetion_id = c.fld_quetion_id
                  group by pc.fld_parent_name, pc.fld_child_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

见SQL Fiddle with Demo

两者都会返回结果:

| FLD_PARENT_NAME | FLD_CHILD_NAME | Q1 | Q2 | Q3 |
---------------------------------------------------
|             Dev |       angelina |  4 |  5 |  2 |
|             Tom |            Ray |  1 |  3 |  2 |

【讨论】:

以上是关于在mysql中行的列的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 MySQL 表中行子集的大小

mysql数据库如何创建自增长标识? id int identity(1,1)在mysql中行不同啊!!!

MySQL中行锁的算法

如何使用 PHP 和 PDO 计算 MySQL 表中行子集的大小(以字节为单位)?

Mysql中行转列和列转行

计算 Octave 中行组的列的平均值