首页 > 解决方案 > 如何获取已添加操作但未删除的所有项目

问题描述

我有一个Activity表,其中存储了用户的操作活动。列类型中有两种类型的操作需要检查:

因此,可以多次从收藏夹中添加或删除相同的对象,因此表中的记录如下:

| 编号 | 类型 | 时间戳 | 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 查询,这会更有效,并会给出最终结果

标签: mysqlsql

解决方案


你可以使用这样的子查询

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'

这是一个演示


推荐阅读