MySQL 通过GROUP_CONCAT将多列合并成一行(一)

先交代一下背景,一共有 2 张表,分别是

ims_rooit_class_fields 字段表

CREATE TABLE `ims_rooit_class_fields` (
  `fieldid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '字段id',
  `formid` int(11) NOT NULL COMMENT '表单id',
  `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段名',
  `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型',
  `required` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否必须',
  `value` text COLLATE utf8mb4_unicode_ci COMMENT '字段赋值',
  `displayorder` int(11) NOT NULL DEFAULT '100' COMMENT '展示顺序',
  `created_at` datetime DEFAULT NULL COMMENT '创建日期',
  `updated_at` datetime DEFAULT NULL COMMENT '更新日期',
  `deleted_at` datetime DEFAULT NULL COMMENT '删除日期',
  PRIMARY KEY (`fieldid`)
) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ims_rooit_class_data 用户填写数据表

CREATE TABLE `ims_rooit_class_data` (
  `dataid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '数据id',
  `formid` int(11) NOT NULL COMMENT '表单id',
  `reid` int(11) NOT NULL COMMENT '记录id',
  `fieldid` int(11) NOT NULL COMMENT '字段id',
  `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段类型',
  `data` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字段内容',
  `created_at` datetime DEFAULT NULL COMMENT '创建日期',
  `updated_at` datetime DEFAULT NULL COMMENT '更新日期',
  `deleted_at` datetime DEFAULT NULL COMMENT '删除日期',
  PRIMARY KEY (`dataid`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

 

字段表中储存了表单需要填写的字段内容,姓名,手机号等

images

 

 

数据表保存用户提交的数据:

images

通常情况下用 多表联查的方式查询用户填写的记录:

/*字段表联合结果表*/
SELECT
  t_data.reid AS reid,
  t_data.`data`,
  t_data.type,
  t_field.title AS title,
  t_field.formid AS formid 
FROM
  ims_rooit_class_data AS t_data
  LEFT JOIN ims_rooit_class_fields AS t_field ON t_data.fieldid = t_field.fieldid 
WHERE
  t_field.type != 'timerange' 

images

 

但这样还需要用程序去遍历所有数据,提取出对应的结果

 

解决这个方式,可以用 GROUP_CONCAT 的方式合并列为一行

SELECT
    any_value(formid),
    reid,
    /*把所有的列合并到一行,通过 逗号 分割*/
    GROUP_CONCAT( DATA ) AS newdata
  FROM
    (
    /*字段表联合结果表*/
    SELECT
      t_data.reid AS reid,
      t_data.`data`,
      t_data.type,
      t_field.title AS title,
      t_field.formid AS formid 
    FROM
      ims_rooit_class_data AS t_data
      LEFT JOIN ims_rooit_class_fields AS t_field ON t_data.fieldid = t_field.fieldid 
    WHERE
      t_field.type != 'timerange' 
    ) AS t_join 
  GROUP BY
  reid

images

在数据查看上会更加直观,不用借助别的语言二次更改

 

另外,在测试的时候,第二行 any_value(formid) 本来是 formid 的,但是服务器上用的是 MySQL 5.7, 提交后报错

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column '×××' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

网上找了一下,改成了any_value 函数,问题解决

请我喝杯咖啡吧~

支付宝
微信