我不确定我的问题是我写错了 MySQL,还是我错误地使用了 ActiveRecord 的子查询。
这是背景:
历史就是一张桌子。历史记录有“id”、“user_id”、“state”和“created_at”。一个用户在历史上可能不止一次拥有相同的状态。
这就是我想要提取的内容:
对于给定的一天,找到第一次取消订阅的用户。
这是我最初写的不准确的查询:
History.select('distinct user_id').where(state: 'unsubscribed').where('date(created_at) = ?', Date.today).all
这给了我今天退订的人数,但不是今天第一次退订的人数。如果有人在 30 天前退订并在今天再次退订,他们将在这组结果中。
我知道如何通过执行两个查询和一些数组减法来使用 Ruby 找到结果集。我的问题是,如何使用 1 个查询/子查询提取这些结果。这是我的尝试,但没有奏效:
sub_query = "(SELECT MIN(h.created_at) FROM history AS h WHERE h.state = 'unsubscribed' AND h.user_id = history.user_id)"
History.where('date(created_at) = ?', Date.today).where("history.user_id IN (#{sub_query})").all
这甚至接近正确的方法吗?我应该做一个子选择吗?我应该只用纯 SQL 编写查询然后使用 ActiveRecord::Base.connection.execute() 吗?任何帮助都会有所帮助,非常感谢。