Mysql 一对多 一条数据对应多条数据 多条数据合并成一个字段显示 您所在的位置:网站首页 sql如何把多条记录合并一行 Mysql 一对多 一条数据对应多条数据 多条数据合并成一个字段显示

Mysql 一对多 一条数据对应多条数据 多条数据合并成一个字段显示

2024-06-09 21:34| 来源: 网络整理| 查看: 265

场景:产品列表显示产品的多个标签 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关键字 可以去重,排序

去重:GROUP_CONCAT(DISTINCT l.title SEPARATOR ',' ) AS labels

排序:GROUP_CONCAT( l.title order by l.id desc SEPARATOR ',') AS labels

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有