独家加入有很多关系

时间:2013-08-23 12:48:31

标签: sql ruby-on-rails postgresql

我有一个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")

如何从我的表中获取没有订阅或没有活动订阅的用户?

2 个答案:

答案 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")