Sql 查询仅具有非活动推送令牌的用户

Sql 查询仅具有非活动推送令牌的用户,sql,postgresql,push-notification,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和4。这有助于我猜测

我有一张这样的桌子

# 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和4。这有助于我猜测哪些用户卸载了我的应用程序


对此的最佳查询是什么?

使用
分组方式
拥有
<如果至少有一个输入为真,则code>bool_或
返回真,否则返回假

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
数据类型。

使用
groupby
having
<如果至少有一个输入为真,则code>bool_或
返回真,否则返回假

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
数据类型。

通常更快:

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
   );
假设只有非活动推送令牌的用户等于设置中没有活动推送令牌的用户(包括根本没有推送令牌的用户)

(用户id)
上的普通btree索引很有帮助-您很可能已经有了

如果您经常使用此查询,并且
push\u tokens
的行数多于几行,那么启用
(user\u id,active)
会更好

如果只有一小部分行处于活动状态
,a将使其速度更快,但:

CREATE INDEX foo_idx ON push_tokens (user_id) WHERE active;
通常速度要快得多:

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
   );
假设只有非活动推送令牌的用户等于设置中没有活动推送令牌的用户(包括根本没有推送令牌的用户)

(用户id)
上的普通btree索引很有帮助-您很可能已经有了

如果您经常使用此查询,并且
push\u tokens
的行数多于几行,那么启用
(user\u id,active)
会更好

如果只有一小部分行处于活动状态
,a将使其速度更快,但:

CREATE INDEX foo_idx ON push_tokens (user_id) WHERE active;

完美的感谢您向我介绍
bool\u或
Perfect!感谢您向我介绍
bool\u或