mysql - 如何获取已添加操作但未删除的所有项目
问题描述
我有一个Activity表,其中存储了用户的操作活动。列类型中有两种类型的操作需要检查:
- add_favorite
- remove_favorite
因此,可以多次从收藏夹中添加或删除相同的对象,因此表中的记录如下:
| 编号 | 类型 | 时间戳 | object_id | 用户 | |----|-----------------|------------|------------|- ------| | 1 | 添加收藏夹 | 1584150783 | 4 | 用户1 | | 2 | 添加收藏夹 | 1584151341 | 5 | 用户1 | | 3 | 删除收藏 | 1584161259 | 4 | 用户1 | | 4 | 添加收藏夹 | 1584168758 | 4 | 用户1 | | 5 | 删除收藏 | 1584171635 | 10 | 用户1 | | 6 | 添加收藏夹 | 1584174201 | 11 | 用户1 | | 7 | 删除收藏 | 1584177194 | 5 | 用户1 |
首先,我构建了两个查询,它们收集了数组中用户的所有 object_id 和 add_favorite 操作。然后我用另一组object_id过滤这个数组,它的动作类型为removed_favorite
SELECT object_id FROM activity WHERE user='user1' AND type='add_favorite';
SELECT object_id FROM activity WHERE user='user1' AND type='remove_favorite';
但这对大量活动非常无效。请告诉我用 LEFT JOIN 查询,这会更有效,并会给出最终结果
解决方案
你可以使用这样的子查询
SELECT object_id
FROM activity a1
WHERE a1.user = 'user1'
AND a1.type = 'add_favorite'
AND object_id NOT IN (
SELECT object_id
FROM activity
WHERE user = 'user1'
AND type = 'remove_favorite'
)
但是,我想您想要一个有效活跃(添加)的收藏夹列表
SELECT a1.object_id
FROM activity a1
WHERE a1.user = 'user1'
AND a1.TIMESTAMP = (
SELECT MAX(a2.TIMESTAMP)
FROM activity a2
WHERE a2.user = a1.user
AND a1.object_id = a2.object_id
AND a2.type IN (
'add_favorite'
,'remove_favorite'
)
)
AND a1.type = 'add_favorite'
这是一个演示。
推荐阅读
- python - python中奇怪的多线程行为
- excel - 有什么方法可以更快地为 Excel VBA Sumifs 工作?
- android - 使用 searchview 在 recyclerview 中突出显示过滤器文本
- javascript - 如何使用 javascript 添加新的数据行?
- excel - 检查字符串是否在 Variant 中,然后分别将 Yes/No 结果替换为 1/0
- flutter - BuildContext 不是在 showDialog 小部件中使用 ListView.builder 的 Flutter 类型
- docker - 如何在容器中使用 docker 命令?
- javascript - 声明布尔值 true 或 false 的自定义值
- node.js - 为什么某些 nodeJS 任务会使 Ubuntu 而不是 Windows 冻结?
- linux - 替换Unix中两个文件之间的列