该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;
纠正所有罪状 – Strawberry
可能比我提供一个更好的解决方案。 – Taemyr
嗯我现在正在测试,但它不适合我。我做了一个sqlfiddle来显示它,它不应该返回用户1,但仍然会:http://sqlfiddle.com/#!2/9be37/1 –