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;