MySQL 常见统计(没有数据则“补0“)

MySQL 常见统计(没有数据则"补0")

已知:各系统和设备表通过 system_id 关联([注]逻辑关联非物理关联)。 求:查询各系统的设备的数量,若该系统无数据,“补0”。 对应的 SQL 语句和数据
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for device
-- ----------------------------
DROP TABLE IF EXISTS `device`;
CREATE TABLE `device` (
  `id` int NOT NULL,
  `deviceid` int NOT NULL,
  `device_name` varchar(255) NOT NULL,
  `system_id` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of device
-- ----------------------------
INSERT INTO `device` VALUES (1, 1, 设备1, 1);
INSERT INTO `device` VALUES (2, 2, 设备2, 3);
INSERT INTO `device` VALUES (3, 3, 设备3, 4);
INSERT INTO `device` VALUES (4, 4, 设备4, 3);
INSERT INTO `device` VALUES (5, 5, 设备5, 3);

-- ----------------------------
-- Table structure for d_system
-- ----------------------------
DROP TABLE IF EXISTS `d_system`;
CREATE TABLE `d_system` (
  `system_id` int NOT NULL,
  `system_name` varchar(255) NOT NULL,
  PRIMARY KEY (`system_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of d_system
-- ----------------------------
INSERT INTO `d_system` VALUES (1, 系统1);
INSERT INTO `d_system` VALUES (2, 系统2);
INSERT INTO `d_system` VALUES (3, 系统3);
INSERT INTO `d_system` VALUES (4, 系统4);
INSERT INTO `d_system` VALUES (5, 系统5);

实现

SELECT
	ds.system_name,
	COUNT(ds.system_id) num
FROM
	d_system ds
LEFT JOIN (
	SELECT
		system_id
	FROM
		device -- WHERE 限制条件
) d ON d.system_id = ds.system_id
-- WHERE 限制条件
GROUP BY
	ds.system_id
经验分享 程序员 微信小程序 职场和发展