0

MySQLで次のようにするにはどうすればよいですか:

私は3つのテーブルを持っています:

ユーザー: ID

コミュニケーション:id、creation_date

user_communication : user_id、communication_id

ここで、特定の日付以降に通信していないすべてのユーザーを選択したいと考えています。

以下は私が今持っているものですが、上で説明したものを取得する方法に行き詰まっています。

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
WHERE c.creation_date < '2013-8-1';
4

3 に答える 3

3

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;
于 2013-08-30T11:12:53.830 に答える
1
SELECT DISTINCT u.id FROM user u
LEFT JOIN user_communication uc ON uc.user_id = u.id
LEFT JOIN (SELECT * FROM communication WHERE creation_date < '2013-8-1') c 
ON c.id = uc.communication_id
WHERE c.id is NULL;
于 2013-08-30T11:15:54.097 に答える
0

いくつかの調査とヘルプの後、次のクエリがあり、うまくいくようです:

SELECT DISTINCT(u.id)
FROM user u
WHERE (SELECT coalesce(max(c.creation_date), '1900-01-01 00:00:00') last_creation_date
       FROM user inneru 
       LEFT JOIN user_communication uc ON uc.user_id = inneru.id
       LEFT JOIN communication c ON c.id = uc.communication_id
       WHERE inneru.id = u.id) < '2012-08-01'

SQLFiddle: http://sqlfiddle.com/#!2/5dfad/10

于 2013-08-30T13:20:17.503 に答える