记录一条sql查询:以逗号隔开的id字符串的查询

目录

前言

在一个项目中有两张表,一张是商品码表,一张是记录出库单明细的出库记录表,记录表中有一个字段保存了以逗号隔开的商品码表的id字符串,需要根据出库明细id查找到对应出库的商品码。

表结构

goods_detail 商品码表结构

sql 复制代码
CREATE TABLE `goods_detail` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `goods_id` bigint(20) NOT NULL COMMENT '商品id',
  `bar_code` varchar(20) DEFAULT NULL COMMENT '箱码',
  `bottle_code` varchar(20) DEFAULT NULL COMMENT '瓶码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='商品码表';

out_goods_record 出库记录表结构

sql 复制代码
CREATE TABLE `out_goods_record` (
  `id` bigint(20) NOT NULL COMMENT 'ID',
  `order_detail_id` bigint(20) NOT NULL COMMENT '出库单明细id',
  `goods_detail_id` longtext COMMENT '商品码id,多个用'',''分隔'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='出库记录';

sql语句

  • 使用查询函数FIND_IN_SET和函数GROUP_CONCAT
sql 复制代码
SELECT
	id,
	bar_code,
	bottle_code
FROM
	goods_detail
WHERE
	FIND_IN_SET(
		id,(
		SELECT
			GROUP_CONCAT( goods_detail_id )
		FROM
			out_good_record
		WHERE
			del_flag = '0'
			AND order_detail_id = 1734492741712220161
		GROUP BY
			order_detail_id
		))>0;

该sql查询效率非常低,需要147秒,前端会提示请求接口超时,不推荐。

  • 将逗号隔开的商品码id转成多行再查询
    将逗号隔开的商品码id转成多行的sql
sql 复制代码
SELECT
			substring_index( substring_index( r.goods_detail_id, ',', s.id + 1 ), ',',- 1 ) AS goods_detail_id
			FROM
			out_good_record r
			CROSS JOIN auto_add_seq s ON s.id <= LENGTH( r.goods_detail_id ) - LENGTH(
			REPLACE ( r.goods_detail_id, ',', '' ))
			WHERE
			r.order_detail_id = 1734492741712220161

auto_add_seq 这张表为自定义表,参考 mysql中字符串截取与拆分链接中的 二、分割成多行

  • 使用EXISTS
sql 复制代码
SELECT
	id,
	bar_code,
	bottle_code 
FROM
	goods_detail d 
WHERE
	EXISTS (
	SELECT
		1 
	FROM
		(
		SELECT
			substring_index( substring_index( r.goods_detail_id, ',', s.id + 1 ), ',',- 1 ) AS goods_detail_id 
		FROM
			out_good_record r
			CROSS JOIN incr_sequence s ON s.id <= LENGTH( r.goods_detail_id ) - LENGTH(
			REPLACE ( r.goods_detail_id, ',', '' )) 
		WHERE
			r.order_detail_id = 1734492741712220161 
		) t 
	WHERE
		t.goods_detail_id = d.id 
	);

由于数据量太大,使用EXISTS花费的时间太多了,EXISTS比较适合内部是大表的情况,不推荐使用

  • 使用IN查询
sql 复制代码
SELECT
	id,
	bar_code,
	bottle_code 
FROM
	goods_detail d 
WHERE
	d.id IN (
	SELECT
		substring_index( substring_index( r.goods_detail_id, ',', s.id + 1 ), ',',- 1 ) AS goods_detail_id 
	FROM
		out_good_record r
		CROSS JOIN incr_sequence s ON s.id < LENGTH( r.goods_detail_id ) - LENGTH( REPLACE ( r.goods_detail_id, ',', '' ) + 1 ) 
	WHERE
		r.order_detail_id = 1734492741712220161 
	);

使用IN查询,要效率要高多了

  • 关联查询
sql 复制代码
SELECT
	id,
	bar_code,
	bottle_code
FROM
	goods_detail d,
	(
	SELECT
	substring_index( substring_index( r.goods_detail_id, ',', s.id + 1 ), ',',- 1 ) AS goods_detail_id
	FROM
	out_good_record r
	CROSS JOIN incr_sequence s ON s.id <= LENGTH( r.goods_detail_id ) - LENGTH(
	REPLACE ( r.goods_detail_id, ',', '' ))
	WHERE
	r.order_detail_id = 1734492741712220161
	) t
WHERE
	d.id = t.goods_detail_id

关联查询效率最高,推荐使用

相关推荐
qq_124987075317 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
倒流时光三十年1 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣501 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx2 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐2 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly3 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客3 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索