我有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中列出的所有项目。
答案 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 = ?)
问号是您要检查的日期。