MySQL对比两张表统计指定日期各产品状态对应数量的实现问题
业务表说明
listings表
存储产品参考编号refno和当前最新状态,refno字段唯一,每个产品仅对应一条记录。若产品当前状态为Publish后续售出,状态会更新为Sold。
状态码映射规则:
- 'D' → Draft
- 'A' → Action
- 'Y' → Publish
- 'S' → Sold
- 'N' → Let
测试数据插入语句:
INSERT INTO listings VALUES (3, 'Y','2021-05-02','2021-10-02','LP01'), (4, 'A','2021-05-01','2021-05-01','LP02'), (5, 'S','2020-10-01','2020-10-01','LP03'), (6, 'N','2021-05-01','2021-10-06','LP06'), (10, 'D','2021-10-06','2021-10-06','LP05'), (11, 'D','2021-01-01','2021-01-01','LP04');
logs表
状态变更日志表,通过refno字段与listings表关联。仅产品状态发生变更时才会生成日志条目,listings表的初始录入不会记录到logs表中。
测试数据插入语句:
INSERT INTO logs VALUES (1, 'Let','Action','2021-06-01','LP01'), (2, 'Action','Draft','2021-10-01','LP01'), (3, 'Draft','Publish','2021-10-02','LP01'), (4, 'Action','Let','2021-10-06','LP06');
现有统计规则
全量数据按状态统计结果:
| status_1 | 计数c |
|---|---|
| Publish | 1 |
| Action | 1 |
| Sold | 1 |
| Let | 1 |
| Draft | 2 |
仅统计2020-10-01的有效条目时,预期结果为仅Sold状态计数为1,其余状态计数均为0。
现有查询问题
原有查询逻辑通过logs表的变更日期,对应扣减status_to的计数、增加status_from的计数来获取指定日期的总计数,存在两个缺陷:
- 查询2021-10-01及之前的变更数据时输出结果不符合预期
- 无法统计初始录入的条目数据,例如2020-10-01的统计需求,因初始录入没有对应的日志记录,无法得到预期的Sold计数为1的结果
核心需求
实现可指定查询日期的状态计数查询:排除查询日期之后发生的所有状态变更,同时覆盖初始录入未生成日志的条目,得到指定日期各状态的正确计数。
内容的提问来源于stack exchange,提问作者Jay Modi
相关产品推荐
相关产品推荐

