MYSQL:如何获取用户条目列表中不存在(NOT exists)的记录的结果



对于每一天,期望用户捕获一个时间表条目。

结果集需要获得用户列表,以及用户在当前月份没有捕获时间表条目的任何日期。

作为2022年11月理想结果集的示例:

UserName | MissedDates
-----------------------
Joe       | 2022-11-20
Joe       | 2022-11-26
Joe       | 2022-11-27
Billy     | 2022-11-02
Billy     | 2022-11-09
etc       | etc
etc       | etc

首先创建一个引用TEMPORARY TABLE,其中包含该月所有预期天数的结果列表,以便它可以用于用户为该月捕获的所有日期记录。可以通过检查哪些记录在DBTable中不存在(NOT EXISTS),哪些记录在TempTable中不存在(NOT EXISTS)。

SET @current_date:=CURDATE();
SET @StartDate:=date_add(date_add(LAST_DAY(@current_date),interval 1 DAY),interval -1 MONTH);
SET @EndDate:=LAST_DAY(@current_date);
CREATE TEMPORARY TABLE MonthlyDatesTbl
WITH RECURSIVE `MonthlyDates` AS
(
SELECT @StartDate AS `day` 

UNION ALL 

SELECT date_add(`day`,interval 1 DAY) AS `day` FROM `MonthlyDates` WHERE `day` < @EndDate
)
SELECT * FROM `MonthlyDates`;

SELECT `MonthlyDatesTbl`.day FROM `MonthlyDatesTbl` 
WHERE NOT EXISTS(SELECT * FROM timesheet_entry WHERE timesheet_entry.user_id = 83 AND timesheet_entry.timesheet_entry_date = MonthlyDatesTbl.day);
DROP TEMPORARY TABLE MonthlyDatesTbl;

对于用户id 83,上面的查询结果如下:

day 
--------
2022-11-20
2022-11-26
2022-11-27

正确地详细说明了用户没有为....捕获条目的日期但

MAIN Q:现在如何应用这个逻辑来查询所有用户,而不仅仅是一个用户?

可能是盯着问题太久而错过了一些简单的东西!?

假设您有一个包含用户名的用户表。你可以这样做:

SELECT u.UserName, m.day 
FROM MonthlyDatesTbl m
JOIN users u on 1=1
WHERE NOT EXISTS(
SELECT * 
FROM timesheet_entry e 
WHERE e.user_id = u.id AND e.timesheet_entry_date = m.day
);

最新更新