查询仅包含非活动推送令牌的用户

时间:2018-02-09 22:31:35

标签: sql postgresql push-notification

我有一张这样的表

# select u.name, pt.active from users u join push_tokens pt on u.id = pt.user_id;

User | active push token
-----+------------------
1    | t
1    | f
2    | t
2    | t
3    | f
3    | f
4    | f
5    | t

我想看到所有只有非活动推送令牌的用户,即用户3&这有助于我猜出哪些用户已经卸载了我的应用程序。

对此最好的查询是什么?

2 个答案:

答案 0 :(得分:1)

使用group byhaving。如果至少一个输入为真,则bool_or返回true,否则返回false。

select u.name 
from users u 
join push_tokens pt on u.id = pt.user_id
group by u.name
having not bool_or(pt.active)

这假定active列是boolean数据类型。

答案 1 :(得分:1)

NOT EXISTS通常要快得多:

SELECT u.*        -- or just columns you need
FROM   users u
WHERE  NOT EXISTS (
   SELECT FROM push_tokens
   WHERE  user_id = u.id
   AND    active  -- assuming boolean NOT NULL
   );

假设只有非活动推送令牌的用户等于您的设置中没有有效推送令牌的用户(包括根本没有推送令牌的用户)。

(user_id)上的普通btree索引对你很有帮助 -

如果您经常使用此查询且push_tokens包含多行,则(user_id, active)上的multicolumn index会更好。

如果只有行的分数为active,则partial index会使其更快(更快),但是:

CREATE INDEX foo_idx ON push_tokens (user_id) WHERE active;