MySQL实现请求审核状态聚合:存拒绝则返回拒绝,全通过则返回通过
MySQL关联REQUESTS与REVIEWS表实现审核状态聚合查询
表结构与需求说明
现有数据表
表REQUESTS
| ID_REQUEST | USER |
|---|---|
| 1 | Adam |
| 2 | Ben |
| 3 | Charlie |
表REVIEWS
| ID_REVIEW | ID_REQUEST | REVIEW |
|---|---|---|
| 1 | 1 | APPROVED |
| 2 | 1 | APPROVED |
| 3 | 1 | DENIED |
| 4 | 2 | APPROVED |
| 5 | 2 | APPROVED |
查询规则
- 若请求存在任意
DENIED审核记录,返回DENIED - 若请求所有审核记录均为
APPROVED,返回APPROVED - 若请求无审核记录,返回
NULL或PENDING
期望输出
| ID_REQUEST | USER | REVIEW |
|---|---|---|
| 1 | Adam | DENIED |
| 2 | Ben | APPROVED |
| 3 | Charlie | NULL (或PENDING) |
用户已考虑用LEFT JOIN捕获无审核请求,不确定GROUP BY、CASE、COALESCE的组合用法,求解决方案。
解决方案
可以通过LEFT JOIN关联两表,结合GROUP BY聚合请求,再用条件判断实现状态逻辑,以下是两种可行写法:
写法一:用CASE结合聚合函数判断
SELECT r.ID_REQUEST, r.USER, CASE -- 优先判断是否存在DENIED记录 WHEN MAX(IF(rev.REVIEW = 'DENIED', 1, 0)) = 1 THEN 'DENIED' -- 再判断是否有审核记录,有则全是APPROVED WHEN COUNT(rev.ID_REVIEW) > 0 THEN 'APPROVED' -- 无审核记录返回PENDING(或改为NULL) ELSE 'PENDING' END AS REVIEW FROM REQUESTS r LEFT JOIN REVIEWS rev ON r.ID_REQUEST = rev.ID_REQUEST GROUP BY r.ID_REQUEST, r.USER;
写法二:用COALESCE简化无记录场景
如果希望无审核记录返回NULL,可以用COALESCE配合聚合后的状态判断:
SELECT r.ID_REQUEST, r.USER, COALESCE( CASE WHEN SUM(rev.REVIEW = 'DENIED') > 0 THEN 'DENIED' ELSE 'APPROVED' END, NULL -- 这里可以替换成'PENDING' ) AS REVIEW FROM REQUESTS r LEFT JOIN REVIEWS rev ON r.ID_REQUEST = rev.ID_REQUEST GROUP BY r.ID_REQUEST, r.USER;
逻辑说明
- LEFT JOIN:确保REQUESTS表中所有请求都被保留,即使没有对应的REVIEWS记录
- GROUP BY:按请求ID和用户分组,聚合每个请求的所有审核记录
- 聚合函数+CASE:
MAX(IF(rev.REVIEW = 'DENIED', 1, 0)) = 1:只要有一条DENIED记录,这个值就为1,优先返回DENIEDCOUNT(rev.ID_REVIEW) > 0:排除无审核记录的情况,此时所有记录都是APPROVED,返回APPROVEDCOALESCE:当聚合后的CASE结果为NULL(即无审核记录时),返回指定的默认值(NULL或PENDING)
内容的提问来源于stack exchange,提问作者Letruc
相关产品推荐
相关产品推荐

