4
回答
mysql 多表查询,聚合统计
华为云4核8G,高性能云服务器,免费试用   
现在有4张表,关系如下:
a-b (b 中包含a的主键)
b-c (c 中包含b的主键)
b-d (d 中包含b的主键)
现在查询sum(c.num) as c_num,sum(d.num) as d_num结果如下:
a编号  a名称    a价格   c_num   d_num
1         物品1       33         55           100  
写SQL是有如下问题:
我在 b 表中分别join c,d,这时会产生重复的合计;
直接在返回的字段中 select sum(c.num) ... as c_num    select sum(d.num) .... as d_num 这样写,在后期的按条件查询时没法操作;
请教一下大家。能不能给提供个思路!谢了
举报
doowan
发帖于4年前 4回/1K+阅
共有4个答案 最后回答: 4年前

引用来自“hnynes”的评论


能不能说具体点,反正我是没有理解你后面说的这个问题. 


用这个表来试一下比较直观,忘了说要使用a表id分组
-- ----------------------------
-- Table structure for `a`
-- ----------------------------
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of a
-- ----------------------------
INSERT INTO `a` VALUES ('1', 'aaaa');
INSERT INTO `a` VALUES ('2', 'bbbb');
INSERT INTO `a` VALUES ('3', 'ccccc');

-- ----------------------------
-- Table structure for `b`
-- ----------------------------
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `aid` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of b
-- ----------------------------
INSERT INTO `b` VALUES ('1', '1');
INSERT INTO `b` VALUES ('2', '2');
INSERT INTO `b` VALUES ('3', '3');

-- ----------------------------
-- Table structure for `c`
-- ----------------------------
DROP TABLE IF EXISTS `c`;
CREATE TABLE `c` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `bid` int(10) DEFAULT NULL,
  `num` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of c
-- ----------------------------
INSERT INTO `c` VALUES ('1', '1', '5');
INSERT INTO `c` VALUES ('2', '2', '1');
INSERT INTO `c` VALUES ('3', '3', '2');
INSERT INTO `c` VALUES ('4', '1', '4');
INSERT INTO `c` VALUES ('5', '3', '2');

-- ----------------------------
-- Table structure for `d`
-- ----------------------------
DROP TABLE IF EXISTS `d`;
CREATE TABLE `d` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `bid` int(10) DEFAULT NULL,
  `num` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of d
-- ----------------------------
INSERT INTO `d` VALUES ('1', '1', '1');
INSERT INTO `d` VALUES ('2', '3', '2');
INSERT INTO `d` VALUES ('3', '1', '1');
INSERT INTO `d` VALUES ('4', '2', '4');
INSERT INTO `d` VALUES ('5', '2', '1');

在外面 再包一层 ,如果不包 只能用having 效率较低,再包一层的话 可以用上where 条件 只不过多耗点内存而已(再包一层 mysql会在内存里建个临时表 当然用过就会咔嚓掉)  

顶部