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关键字 可以去重,排序

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值