迪卡尔积处理用户表和日期表关联展示问题

528 阅读1分钟

1. 需求描述

用户表t_user有100个用户,用户登录记录表t_user_log有若干条每个用户在10月1日到10月31日期间的登录记录(某天未登录则无数据),要求展示查询日期范围内每个用户每天登录时长,如查看10月1日到10月3日所有用户每天的登录时长。 展示如下:

image.png

2. 问题描述

因为每个用户不一定每天都登录,所以t_user_log表并不会每个用户每个日期都对应一条数据。 t_user_log表中数据展示如下:

image.png

3. 迪卡尔积

sql查询中的迪卡尔积通常指两张关联时,因为关联字段未对应上,造成两个结果集中数据互相关联。如a表与b表关联查询,a表查询结果集3条数据,b表查询结果集4条数据,则迪卡尔积会造成查询结果为3*4=12条数据结果。

4. 该需求处理方法

首先对于日期,我们可以维护一个日期表t_days,存储每年的日期(可以分工作日和假期)。 如: image.png

5.用户表与日期表关联,再和登录记录表左连接

select u.user_id, d.date, nvl(l.time, 0) time from t_user u inner join t_days d on d.date >= '2021-10-01' and d.date <= '2021-10-03' left join t_user_log l on u.id = l.user_id and d.date = l.log_date and l.log_date >= '2021-10-01' and l.log_date <= '2021-10-03';