mysql多字段去重,并计数

Mysql版本5.5.42
有两个表,表结构与数据如下
1、goods表

CREATE TABLE `goods` (
  `id` int(10) unsigned NOT NULL,
  `product` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL,
  `size` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL,
  `color` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



INSERT INTO `goods` (`id`, `product`, `size`, `color`, `status`) VALUES
(8318, '1', '5', '11', '1'),
(8319, '1', '4', '11', '1'),
(8320, '1', '3', '11', '1'),
(8321, '1', '2', '11', '1'),
(8322, '2', '6', '81', '1'),
(8323, '2', '5', '81', '1'),
(8324, '2', '4', '81', '1'),
(8325, '2', '3', '81', '1'),
(8326, '2', '2', '81', '1'),
(8327, '2', '6', '32', '1'),
(8328, '2', '5', '32', '1'),
(8329, '2', '4', '32', '1'),
(8330, '2', '3', '32', '1'),
(8331, '2', '2', '32', '1'),
(8332, '1', '6', '32', '1'),
(8333, '1', '5', '32', '1'),
(8334, '1', '4', '32', '1'),
(8335, '1', '3', '32', '1');

2、product_colors表


CREATE TABLE `product_colors` (
  `id` int(10) unsigned NOT NULL,
  `product_code` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品代码',
  `color_code` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '颜色代码',
  `series_code` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '系列代码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


INSERT INTO `product_colors` (`id`, `product_code`, `color_code`, `series_code`) VALUES
(13887, '1', '11', '114'),
(13888, '2', '81', '115'),
(13889, '2', '32', '108'),
(13889, '2', '31', '101'),
(13891, '3', '18', '117'),
(13892, '3', '32', '119'),
(13893, '1', '32', '114');

需求:要求查询出goods表中存在的product、颜色的series_code类别以及数量,相同颜色和产品为1个数量,不同尺寸不累计。
例子中的数据 查询出来 应该是
series_code 114 num 2
series_code 115 num 1
series_code 108 num 1
sql 语句该怎么写?
参考了下面的答案,下面这个sql能解决我的问题

select b.series_code,count(1) num 
from product_colors b 
where (b.product_code, b.color_code) in 
(select product, color from goods) 
group by b.series_code;

感谢所有回答我提问的朋友们。

阅读 8.6k
3 个回答

需求描述混乱,相同颜色和产品为一个数量,列举列子查询数据又把类别以及该类别的数量列出,按你列的结果来看,就是要取出现有商品goods中还有哪些产品颜色和类别嘛。。num还需要算吗?难不成你product_colors还会记录两条以上同样产品颜色类别的记录?一下sql仅为实现的你展示的结果:

select b.product_code, b.color_code,b.series_code,count(1) num 
from product_colors b 
where (b.product_code, b.color_code) in 
(select product, color from goods) 
group by b.product_code, b.color_code,b.series_code;

先说一下,这是笨办法,我上次做统计是这么做的,不喜勿喷
然后看了一下别人的答案,我发现是我把问题想复杂了。可忽略我这条,谢谢

1,先用group_concat(product_code,color_code,series_code)分个组
2,将得到的数据按你自己的要求处理之后再使用

个人感觉表设计的还不是很好,有一个外键做关联就可以了 ,没必要搞这么多冗余字段。
product表你应该是想作为一种规格,goods是具体的商品。
话不多说,贴sql:

select 
    DISTINCT p.series_code, count(p.id) num 
from product_colors as p  
left join goods as g on 
    (p.product_code =  g.product AND p.color_code = g.color) 
group by 
    p.color_code,p.series_code,g.size ;

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题