SQL查询可以联接,按特定元素过滤并返回补充记录

时间:2019-01-05 23:08:17

标签: mysql sql mariadb

我有2张桌子:

sites:此表代表站点列表以及有关它们的一些信息 任务:用于按网站和日期将任务分配给特定员工的表

我需要的是一个查询,该查询将使所有在特定日期尚未在任务中的网站都获得。

我得到的最接近的是:

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中列出的所有项目。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您希望所有尚未分配 的站点/日期组合。

如果是这样,您可以使用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子查询替换为您关心的日期列表。

答案 1 :(得分:0)

使用相关子查询:

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

问号是您要检查的日期。