MySQL连接/子查询,其中结果由外部表的多个值过滤

MySQL连接/子查询,其中结果由外部表的多个值过滤,mysql,sql,database,date,join,Mysql,Sql,Database,Date,Join,我有两张桌子: 使用者 用户操作 用户操作表具有以下属性: 身份证 用户id 类型 时间戳 我有两种不同类型的动作: 打开的消息 收到的消息 现在我的问题是:我如何进行查询,以便获得上个月内打开邮件的所有用户,但排除最近2天内收到邮件的所有用户 我认为这可以通过某种形式的连接来实现,然后在子查询中使用WHERE NOT IN,但这听起来不是很有效,所以我想知道是否有更好的方法。我通常倾向于使用joins而不是EXIST/NOT EXIST子查询 下面是一种使用自左联接的方法: SEL

我有两张桌子:

  • 使用者
  • 用户操作
用户操作表具有以下属性:

  • 身份证
  • 用户id
  • 类型
  • 时间戳
我有两种不同类型的动作:

  • 打开的消息
  • 收到的消息
现在我的问题是:我如何进行查询,以便获得上个月内打开邮件的所有用户,但排除最近2天内收到邮件的所有用户


我认为这可以通过某种形式的连接来实现,然后在子查询中使用WHERE NOT IN,但这听起来不是很有效,所以我想知道是否有更好的方法。

我通常倾向于使用
join
s而不是
EXIST
/
NOT EXIST
子查询

下面是一种使用自左联接的方法:

SELECT DISTINCT
    user_id
FROM
    user_action ua
    LEFT JOIN ua2 
        ON  ua2.user_id = ua.userid
        AND ua2.type = 'received message'
        AND ua2.timestamp > CURRENT_TIMESTAMP() - INTERVAL 2 DAY
WHERE 
    ua.type = 'opened message'
    AND ua.timestamp > CURRENT_TIMESTAMP() - INTERVAL 1 MONTH
    AND ua2.user_id IS NULL
详情:

  • ua1
    使用
    WHERE
    子句搜索上个月内打开过邮件的用户
  • LEFT JOIN ua2
    option在过去两天内尝试查找同一用户收到的消息
  • 其中。。。ua2.user_id为NULL
    删除发生此类消息的记录(即
    左连接成功的记录)
  • SELECT DISTINCT
    避免在给定用户上个月收到多条消息时重复输出行

请向我们展示预期输出。