业务场景:
用户填写申请信息,然后进行审核, 审核有通过、拒绝、退回。每次审核都要记录审核结果和处理意见。
业务需求:
现需要查询申请记录,可根据审核状态来过滤筛选。
业务分析:
申请信息审核通过或拒绝之后流程结束,若退回,则需要重新修改申请信息并再次提交审核,这就存在一个 提交->退回->提交->...->退回的循环,每次退回都会产生一个审核记录,所以申请信息和审核信息是1对多的关系。
查询的时候只关注审核记录的最新一条审核信息,其他的只作为历史存档用,无需关注。
表设计:
申请表: apply_info
列名类型备注
info_idvarcharid
infovarchar申请信息
statusint申请状态
审核记录表: audit_log
列名类型备注
log_idvarchar记录id
info_idvarchar关联的申请表id
resultint审核结果
status_beforeint审核前状态
status_afterint审核后状态
audit_timedatetime审核时间
查询sql:
SELECT *
FROM apply_info ai
LEFT JOIN audit_log al
ON ai.info_id = al.info_id;
该查询结果会出现重复的申请信息, 但对应不同审核记录的结果,所以需要对以上sql进行改造
SELECT *
FROM apply_info ai
LEFT JOIN audit_log al
ON al.log_id = (
SELECT al_in.log_id
FROM audit_log al_in
WHERE al_in.info_id = ai.info_id
ORDER BY al_in.audit_time DESC
LIMIT 1
);
此处使用mysql的写法形式,省去了where条件的写法。
在内关联查询中只获取申请记录对应的最新一条审核信息,最终获得一条申请信息和其对应的一个审核记录的关联结果,完成目标。
以上若存在错误请各位看官指出,若有更好的实现方法,还请不吝赐教。