【mysql】MySQL 優化使用sum函數統計同一張表不同條件的記錄條數

在看到一位同事寫的sql語句,發現,在同一張表統計不同條件的數量的個數時是這樣寫的(公司數據庫表就不貼了,新建了一張簡單表記錄下)

表結構如下:

DROP TABLE IF EXISTS `al_users`;
CREATE TABLE `al_users`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `pid` int(11) DEFAULT NULL,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `is_del` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of al_users
-- ----------------------------
INSERT INTO `al_users` VALUES (1, 0, 'zhangsan', 'zhangsan', 10, 0);
INSERT INTO `al_users` VALUES (2, 0, 'lisi', 'lisi', 21, 0);
INSERT INTO `al_users` VALUES (3, NULL, 'wangwu', 'wangwu', 26, 1);

SET FOREIGN_KEY_CHECKS = 1;

 

現需求如下:統計同一個父級id下的總用戶數,和未刪除的用戶數

同事試這樣寫的:

select 	
(select count(id) FROM al_users) AS total,
(select count(id) FROM al_users WHERE is_del = 0) AS unDelTotal
FROM al_users
GROUP BY al_users.pid

優化後:

select count(id) AS total,
count(is_del=0) AS unDelTotal
FROM al_users 
GROUP BY al_users.pid

這幾條數據測試時運行時間還看不出來太大的差別,數據量大的話,差別就出來了。

後記:

mysql中的sum函數,當參數是具體列名時,是求和,當參數是條件時,是統計條數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章