mysql - 根据两个字段查找一个表中缺失的值,这些值存在于另一个表中

标签 mysql sql

我已经为此苦苦挣扎了几个小时。

我有两个表:第一个有出勤记录,有行 ID、客户 ID、服务日期和从 0 到 16 的单位数。第二个表有客户响应,有行 ID、客户 ID、服务日期和许多其他领域。

这里的问题是:如何找到第二张 table 上缺失的客户,这些客户在特定日期的第一张 table 上有超过 0 个单位?请注意,唯一的唯一字段是行 ID。

几小时后,我想到了这个,它的工作原理,但出于某种原因,对于大于 20 天的日期范围返回一个空结果集:

SELECT `caseload`.* FROM `caseload` WHERE `caseload`.`client_id` NOT IN
(
    SELECT  `caseload`.`client_id` FROM `caseload`
    JOIN    `form_psr`
    ON      `caseload`.`client_id` = `form_psr`.`client_id`
    AND     `caseload`.`date` = `form_psr`.`service_date`
    WHERE   `caseload`.`date` >= '2019-07-01' AND `caseload`.`date` <= '2019-07-31'
)
HAVING `date` >= '2019-07-01' AND `date` <= '2019-07-31'
AND `units` > 0

这个 sqlfiddle 有一些示例数据:http://sqlfiddle.com/#!9/0a4be2/49

提前致谢!

最佳答案

使用不存在:

select cl.*
from caseload c 
where c.units <= 16 and
      c.service_date >= '2019-07-01' and
      c.service_date <  '2019-08-01' and
      not exists (select 1
                  from form_psr as fp 
                  where c.client_id = fp.client_id 
                 );

请注意,我还更改了日期比较。此版本适用于日期和日期/时间值。一般来说,between 可能会对日期/时间值产生意想不到的行为,因此我建议使用这种明确的结构。

我还假设单位数永远不会是负数。

关于mysql - 根据两个字段查找一个表中缺失的值,这些值存在于另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57368286/

相关文章:

php - 如何 JOIN 这 3 个表

php - 在表中每隔一行回显不同的表列

php - 无法使用 php session 重定向到另一个页面

sql - 如何重组 postgres 表中的记录并永久保存

sql - 选择带有连接的 NVL

sql - 如何导出 Oracle 统计信息

mysql - 通过eventid获取每个用户的最后一条记录

mysql - 在 VALUES 子句中执行语句 MYSQL

mysql - SUM 列值与 group by aggregate 处理空值

sql - 如何在多个分区上执行 SQL 选择?