mysql - MySQL 连接/子查询,其中结果由外部表的多个值过滤
问题描述
我有两张桌子:
- 用户
- 用户操作
user_action 表具有以下属性:
- ID
- 用户身份
- 类型
- 时间戳
我有两种不同类型的动作:
- 打开的消息
- 收到消息
现在我的问题是:如何进行查询,以获取上个月内打开消息的所有用户,但排除过去 2 天内收到消息的所有用户?
我认为这可以通过某种形式的连接来完成,然后将 WHERE NOT IN 与子查询一起使用,但这听起来不是很有效,所以我想知道是否有更好的方法。
解决方案
我通常倾向于使用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
当给定用户在上个月收到多条消息时,避免重复的输出行
推荐阅读
- javascript - 如何找出数组是否为零以及如何删除它
- c++ - MSYS2 CMake 路径前缀是 Windows 格式 (C:/) 但需要 MSYS2/*nix 样式 (/c/) 才能链接
- protractor - 如何在量角器中测试切换全屏开/关
- javascript - 在 JavaScript 中使用相同的输入调用时,switch 语句返回不同的结果
- algorithm - 树分解的算法
- android - 放置图标的底部应用栏问题
- c# - 无法使用 Unity 和 OAuth2.0 获取授权码
- java - maven-replacer-plugin 抛出 [错误] 非法组引用
- python - 在python中识别具有相似图案的特定元素/形状的数据结构
- google-apps-script - 将一个列表中的值匹配到不同工作表上的另一个列表并复制单个单元格 GAS