消息关闭
    暂无新消息!

求一条复杂sql的写法

问题作者 : 大树2017-08-12发布
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');

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');

需求:要求查询出goods表中存在的product、颜色的series_code类别以及数量,相同颜色和产品为1个数量,不同尺寸不累计。
例子中的数据  查询出来 应该是  
series_code  114   num   1
series_code  115   num   1
series_code  108   num   1

1个回答

︿ 2
mysql> select * from goods;
+------+---------+------+-------+--------+
| id   | product | size | color | status |
+------+---------+------+-------+--------+
| 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      |
+------+---------+------+-------+--------+
14 rows in set (0.00 sec)

mysql> select * from product_colors;
+-------+--------------+------------+-------------+
| id    | product_code | color_code | series_code |
+-------+--------------+------------+-------------+
| 13887 | 1            | 11         | 114         |
| 13888 | 2            | 81         | 115         |
| 13889 | 2            | 32         | 108         |
| 13889 | 2            | 31         | 101         |
| 13891 | 3            | 18         | 117         |
| 13892 | 3            | 32         | 119         |
+-------+--------------+------------+-------------+
6 rows in set (0.00 sec)

mysql> select series_code,count(distinct product_code)
    -> from product_colors c inner join goods g on c.product_code=g.product and c.color_code=g.color
    -> group by series_code;
+-------------+------------------------------+
| series_code | count(distinct product_code) |
+-------------+------------------------------+
| 108         |                            1 |
| 114         |                            1 |
| 115         |                            1 |
+-------------+------------------------------+
3 rows in set (0.00 sec)