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

bis0qfac  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(364)

我有两张table:
用户
用户操作
用户操作表具有以下属性:
身份证件
用户id
类型
时间戳
我有两种不同的行为:
打开的邮件
收到的消息
现在我的问题是:我如何进行查询,以便获得所有在上个月内打开邮件的用户,但排除所有在过去2天内收到邮件的用户?
我认为这可以通过某种形式的连接来完成,然后在子查询中使用where not in,但这听起来不是很有效,所以我想知道是否有更好的方法。

mklgxw1f

mklgxw1f1#

我通常倾向于使用 JOIN s而不是 EXIST / NOT EXIST 子查询。
下面是一个使用self的方法- LEFT JOIN :

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 optionnaly尝试在过去两天内查找同一用户的已接收消息 WHERE ... ua2.user_id IS NULL 删除发生此类消息的记录(即 LEFT JOIN (成功) SELECT DISTINCT 当给定用户在上个月内收到多条消息时,避免重复的输出行

相关问题