Rails/SQL-如何在一个组中按不同的值进行筛选



我在Rails中工作,但SQL中的答案同样有用。假设我有一个用户表和一个购买表。我想找到只购买过物品A的用户。我希望使用以下查询:

User.joins(:purchases).group(:id).having("DISTINCT(item) = 'A'").pluck(:id)

这是我需要回答的问题的简化,但这个分组问题是我的主要障碍。出于这个原因,我希望得到一个逻辑上非常相似的答案,因为其他解决方案可能不适用。

这在Rails中有效吗?

User.joins(:purchases).group(:id).having("MIN(item) = MAX(item) AND MIN(item) = 'A'").pluck(:id)

这个短语为:只有一个不同的值(因为MIN()MAX()相等(,即'A'

或者:

having("MAX(CASE WHEN item <> 'A' THEN 1 ELSE 0 END) = 0")

代表:除了'A',没有其他值。

having中,您只能对在例如having("id > 1")上进行分组的列使用聚合函数(例如having count(id) > 2(或表达式。

因此,根据您的数据库,您可能会尝试找到一个聚合函数,该函数根据id标识分组中项目的存在。对于PostgreSql来说,这将类似于(尚未测试(:

...
GROUP BY id
HAVING 'A' = ANY(ARRAY_AGG(item))

最新更新