目录
- 背景
- sql 语句
- 总结
背景
一个项目中,商品表和商品码表是一对多的关系,但由于程序没有控制好,导致有些商品码对应有多个商品,为了修正数据,我们得把商品码对应多个商品的商品码找出来.
sql 语句
goods_detail表结构
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 '商品码',
`library_status` int(1) NOT NULL DEFAULT '1' COMMENT '在库状态 1-在库 2-离库',
`out_type` int(1) NOT NULL DEFAULT '3' COMMENT '离库类型 3-未离库 4-出库 5-调拨(出的时候标记)',
`goods_status` int(1) NOT NULL DEFAULT '4' COMMENT '是否可用 3-不可用 4-可用'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='商品明细表';
查询商品码对应多个商品的商品码的sql
SELECT
d.bar_code AS 商品码,
count( DISTINCT d.goods_id ) AS 商品数
FROM
goods_detail d
WHERE
d.library_status = 1
AND d.out_type = 3
AND d.goods_status = 4
AND d.bar_code IS NOT NULL
AND d.bar_code != ''
AND d.bar_code != '0'
AND d.bar_code != '无'
GROUP BY
d.bar_code
HAVING 商品数 > 1;
查询结果
验证sql
SELECT
d.id,d.goods_id,d.bar_code
FROM
air_goods_detail d
WHERE
d.library_status = 1
AND d.out_type = 3
AND d.goods_status = 4
AND d.bar_code = '202312181250';
随机挑一个商品码查询,果然对应两个不同的商品,sql查询正确。
总结
在上述 sql统计查询中,先按商品码分组,再去重商品id记数(count( DISTINCT d.goods_id )),最后通过HAVING 把统计结果进行过虑,得到最终想要的商品码。