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