条件where
是撤消. left join
最初的解决方案是将其移至on
子句:
SELECT DISTINCT u.id FROM user u
LEFT JOIN user_communication uc ON uc.user_id = u.id
LEFT JOIN communication c ON c.id = uc.communication_id and c.creation_date < '2013-8-1';
但这并不能满足您的要求。这将检索所有记录。如果select
子句中有创建日期字段,则当该日期之前有记录时,它将为 NULL。
对于自该日期以来没有通信,您可以执行“双重”否定“查询。查找自该日期以来的记录,并返回不匹配项:
SELECT DISTINCT u.id
FROM user u LEFT JOIN
user_communication uc
ON uc.user_id = u.id LEFT JOIN
communication c
ON c.id = uc.communication_id and c.creation_date >= '2013-08-01'
WHERE c.creation_date is NULL;
编辑:
我懂了。这个问题比我上面的回答要微妙一些。每个用户都有多个通信,因此没有一个可以稍后进行。以下查询通过分组来测试这一点,u.id
然后检查NULL
上述连接中是否没有非值:
SELECT u.id
FROM user u LEFT JOIN
user_communication uc
ON uc.user_id = u.id LEFT JOIN
communication c
ON c.id = uc.communication_id and c.creation_date >= '2012-08-01'
group by u.id
having min(c.creation_date is null) = 1;