如何实现符合条件的恰好5条记录的secret_number求和,或返回计数?
解决方案
表结构
CREATE TABLE test( id INT AUTO_INCREMENT PRIMARY KEY, server_id VARCHAR(15) NOT NULL, secret_number INT NOT NULL, processing_status VARCHAR(15) DEFAULT 'UNPROCESSED', ts TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) );
需求说明
需要查询processing_status = 'UNPROCESSED'且server_id = 'R_SERVER'的记录,按id排序取前5条的secret_number总和,但要求:
- 要么当符合条件的记录不足5条时返回
NULL - 要么同时返回记录数和总和,方便Python代码判断是否忽略结果
方案1:不足5条时返回NULL
通过子查询获取前5条记录后,用CASE判断记录数是否为5,满足则返回求和值,否则返回NULL:
SELECT CASE WHEN COUNT(*) = 5 THEN SUM(secret_number) ELSE NULL END AS secret_sum FROM ( SELECT secret_number FROM test WHERE processing_status = 'UNPROCESSED' AND server_id = 'R_SERVER' ORDER BY id LIMIT 5 ) t1;
方案2:同时返回记录数和总和
直接统计前5条记录的数量与总和,Python代码可通过判断record_count是否等于5,决定是否使用secret_sum:
SELECT COUNT(*) AS record_count, SUM(secret_number) AS secret_sum FROM ( SELECT secret_number FROM test WHERE processing_status = 'UNPROCESSED' AND server_id = 'R_SERVER' ORDER BY id LIMIT 5 ) t1;
内容的提问来源于stack exchange,提问作者curious_brain
相关产品推荐
相关产品推荐

