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 回答