You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL实现请求审核状态聚合:存拒绝则返回拒绝,全通过则返回通过

MySQL关联REQUESTS与REVIEWS表实现审核状态聚合查询

表结构与需求说明

现有数据表

表REQUESTS

ID_REQUESTUSER
1Adam
2Ben
3Charlie

表REVIEWS

ID_REVIEWID_REQUESTREVIEW
11APPROVED
21APPROVED
31DENIED
42APPROVED
52APPROVED

查询规则

  • 若请求存在任意DENIED审核记录,返回DENIED
  • 若请求所有审核记录均为APPROVED,返回APPROVED
  • 若请求无审核记录,返回NULL或PENDING

期望输出

ID_REQUESTUSERREVIEW
1AdamDENIED
2BenAPPROVED
3CharlieNULL (或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;

逻辑说明

  1. LEFT JOIN:确保REQUESTS表中所有请求都被保留,即使没有对应的REVIEWS记录
  2. GROUP BY:按请求ID和用户分组,聚合每个请求的所有审核记录
  3. 聚合函数+CASE:
    • MAX(IF(rev.REVIEW = 'DENIED', 1, 0)) = 1:只要有一条DENIED记录,这个值就为1,优先返回DENIED
    • COUNT(rev.ID_REVIEW) > 0:排除无审核记录的情况,此时所有记录都是APPROVED,返回APPROVED
    • COALESCE:当聚合后的CASE结果为NULL(即无审核记录时),返回指定的默认值(NULL或PENDING)

内容的提问来源于stack exchange,提问作者Letruc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:26:16