sql查询,通过特定元素连接、过滤并返回免费记录

xv8emn3q  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(273)

我有两张table:
站点:此表表示站点列表及其相关信息任务:按站点和日期为特定员工分配任务的表
我需要的是一个查询,获取所有网站还没有在一个特定日期的任务。
最接近的是:

SELECT 
    sites.ID, 
    sites.name 
FROM 
    sites
    LEFT JOIN tasks ON tasks.site_ID = sites.ID
WHERE tasks.ID IS NULL

此查询返回尚未在整个任务表中列出的站点,而不仅仅是特定日期的站点。
我对这些更复杂的问题还比较陌生,所以请容忍我,因为我可能遗漏了一些明显的东西。我只是对这个问题很费劲。
要重申如果表1是站点,表2是任务,我需要一个查询,以获取表1中尚未在表2中列出的特定日期的所有项目。

dsf9zpds

dsf9zpds1#

使用相关子查询:

SELECT 
    s.ID,
    s.name
FROM sites s
WHERE NOT EXISTS (SELECT 1 FROM tasks WHERE site_ID = s.ID and date = ?)

其中问号是您要检查的日期。

rjee0c15

rjee0c152#

如果我理解正确,您需要所有尚未分配的站点/日期组合。
如果是这样的话,你可以用 CROSS JOIN 生成所有可能的组合,然后使用某种方法 LEFT JOIN/WHERE --要删除现有的:

select s.id as site_id, d.date
from sites s cross join
     (select distinct t.date from tasks) d left join
     tasks t
     on t.site_id = s.id and t.date = d.date
where t.site_id is null;

如果只查找一个日期,则更简单的查询是:

select s.*
from sites s
where not exists (select 1
                  from tasks t
                  where t.site_id = s.id and t.date = $date
                 );

对于多个日期,第一种方法更简单——您可以替换 d 包含您关心的日期列表的子查询。

相关问题