Mysql 一对多 一条数据对应多条数据 多条数据合并成一个字段显示 | 您所在的位置:网站首页 › sql如何把多条记录合并一行 › Mysql 一对多 一条数据对应多条数据 多条数据合并成一个字段显示 |
场景:产品列表显示产品的多个标签 mysql 查询。 以往的解决办法都是查出先查出产品列表,在循环查询标签,多个标签用","隔开。 这样查询列表查一次数据库,循环列表又要查询数据库多次。性能太差。 表结构: 产品表: CREATE TABLE `kx_product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL DEFAULT '标题', `preview` varchar(200) NOT NULL DEFAULT '' COMMENT '预览图片', `content` varchar(2000) NOT NULL DEFAULT '' COMMENT '内容', `number` varchar(20) NOT NULL DEFAULT '' COMMENT '货号', `stock` int(10) NOT NULL DEFAULT '0' COMMENT '库存', `add_time` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', `memo` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='系统:产品表'; 标签表: CREATE TABLE `kx_product_label` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题', `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1:删除;0:正常', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '-1:删除;-1:隐藏;0:禁用; 1:启用;2:锁定', `add_time` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', `memo` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='系统:产品标签'; 产品标签关系表: CREATE TABLE `kx_product_item_label` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_product` int(11) NOT NULL DEFAULT '0' COMMENT 'from:kx_product->id', `id_label` int(11) NOT NULL DEFAULT '0' COMMENT 'from:kx_product_label->id', `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1:删除;0:正常', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '-1:删除;-1:隐藏;0:禁用; 1:启用;2:锁定', `add_time` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', `memo` varchar(255) NOT NULL DEFAULT '' COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COMMENT='系统:产品标签集合 一个产品有很多个标签'; 解决办法: 使用 关键词 GROUP_CONCAT():(返回一个字符串结果,该结果由分组中的值连接组合而成。) 1.做链接查询: SELECT a.id, a.content, a.title, a.add_time, a. CODE, a.number, l.title FROM `kx_product` `a` LEFT JOIN `kx_product_item_label` `ls` ON `ls`.`id_product` = `a`.`id` LEFT JOIN `kx_product_label` `l` ON `l`.`id` = `ls`.`id_label` 结果: 上面sql 查询出所有结果 我们要的是产品列表 中显示 多个标签 2.加上GROUP_CONCAT() 关键字 加上关键字后,结果集发生了变化,变成了一条数据的字段显示了所有标签 分组处理:得到想要的结果
去重:GROUP_CONCAT(DISTINCT l.title SEPARATOR ',' ) AS labels 排序:GROUP_CONCAT( l.title order by l.id desc SEPARATOR ',') AS labels
|
CopyRight 2018-2019 实验室设备网 版权所有 |