私の問題は、MySQL の書き方が間違っていることなのか、それとも ActiveRecord でサブクエリを誤って使用していることが問題なのかわかりません。
背景は次
のとおりです。歴史はテーブルです。履歴には「id」、「user_id」、「state」、および「created_at」があります。ユーザーは、履歴の中で同じ状態を 2 回以上持つ場合があります。
私が引っ張ろうとしているのは次のとおりです。
特定の日について、初めて購読を解除したユーザーを見つけます。
私が最初に書いた不正確なクエリは次のとおりです。
History.select('distinct user_id').where(state: 'unsubscribed').where('date(created_at) = ?', Date.today).all
これで、今日購読を解除した人の数がわかりますが、今日初めて購読を解除した人の数はわかりません。誰かが 30 日前に購読を解除し、今日再び購読を解除した場合、それらはこの一連の結果に含まれます。
Ruby を使用して 2 つのクエリといくつかの配列の減算を行うことにより、結果セットを取得する方法を知っています。私の質問は、これらの結果を 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() を使用する必要がありますか? どんな助けでも役に立ち、大歓迎です。