我有一个Postgres表,其中用户可以拥有多个付款订阅,并且付款订阅处于活动或非活动状态,这通过付款订阅表上的activated_at和inactivated_at日期字段显示。我现在想要找到没有有效付款订阅的所有用户。
在没有任何付款订阅的情况下查找所有用户非常容易
User.joins("LEFT JOIN payment_subscriptions ON (payment_subscriptions.user_id = users.id)").where("payment_subscriptions.id IS NULL")
我还想查找只有非活动订阅的所有用户。如果我使用与上面相同的模式,我将找到所有在某些时候已经停用其订阅的用户,但不能保证他们也没有有效的订阅。
User.joins("LEFT JOIN payment_subscriptions ON (payment_subscriptions.user_id = users.id)").where("payment_subscriptions.inactivated_at IS NOT NULL")
如何从我的表中获取没有订阅或没有活动订阅的用户?
答案 0 :(得分:2)
这个用户可以为您提供没有任何有效订阅的用户。
User.joins("LEFT JOIN payment_subscriptions on (payment_subscriptions.user_id = users.id and payment_subscriptions.inactivated_at is null)").where("payment_subscriptions.id is null")
如果您只想获得不活跃的人,请使用之前的加入
我不知道是否可以使用rails,但您也可以使用not exists
语法:
User.where('
not exists (
select *
from payment_subscriptions as ps
where ps.user_id = users.id and ps.inactivated_at is not null
)
')
答案 1 :(得分:0)
如果用户目前没有付款订阅,您没有提供太多关于实际定义的信息,但据我所知,您需要检查payment_subscriptions.inactivated_at是否为空且payment_subscriptions.id是也是空的。
User.joins("LEFT JOIN payment_subscriptions ON (payment_subscriptions.user_id = users.id)").where("payment_subscriptions.inactivated_at IS NOT NULL AND payment_subscriptions.id IS NULL")