我在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))