我有一张这样的表
# 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&这有助于我猜出哪些用户已经卸载了我的应用程序。
对此最好的查询是什么?
答案 0 :(得分:1)
使用group by
和having
。如果至少一个输入为真,则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;