特定の制約が与えられたすべての個々のユーザーに対して、最初に作成されたレコードと、最初に作成されたレコードを除くすべてのレコードを返そうとしています。私のSQLは壊れていますが、私の人生ではどこで/なぜなのかわかりません。
オブジェクト モデル
関心のある 4 つのモデルがあります: User、Course、Question、および QuestionRecord です。
ユーザーが質問に回答するたびに、QuestionRecord が生成されます。QuestionRecord は、User、Course、および Question との多対 1 です。(カーディナリティは正しいですか? 各 QuestionRecord には、正確に 1 つの User、1 つの Course、および 1 つの Question への外部キーがあります)
ルビーの場合:
class QuestionRecord < ActiveRecord::Base
belongs_to :user
belongs_to :course
belongs_to :question
…
end
望ましい結果 #1: 最初の記録
私が望むのは、コースと質問を指定して、各ユーザーの最初の質問レコードを返すことです。別の言い方をすれば、ジェーンとビルが質問に 2 回回答し、ジョンは未回答で、ピートが 7 回回答した場合、ジェーン、ビル、とピート。
コードでこれを行うこともできますが、効率のために SQL で行う必要があります。
これは私が持っているものです:
SELECT qr.id
FROM users u
INNER JOIN question_records qr
ON u.id =
(SELECT x.user_id
FROM question_records x
WHERE x.course_id = #{course.id}
AND x.question_id = #{question.id}
AND x.user_id = u.id
ORDER BY created_at ASC
LIMIT 1 )
このクエリは 40 分ほど実行されるだけで、実際には何も返されません。50 レコードのサブセットで実行したところ、返されたすべての qr.id 結果が「1」であるという奇妙な問題がありました。
望ましい結果 #2:最初のレコードを除くすべて
ここで、最初のレコードを除くすべてのユーザーのすべてのレコードが必要です。私の考えでは、本質的に、これは同じクエリですが、すべてのレコードが必要であり、返されたインデックスを 1 つオフセットしたいという点が異なります。
SELECT qr.id
FROM users u
INNER JOIN question_records qr
ON u.id =
(SELECT x.user_id
FROM question_records x
WHERE x.course_id = #{course.id}
AND x.question_id = #{question.id}
AND x.user_id = u.id
ORDER BY created_at ASC
OFFSET 1 )
ただし、最初のクエリが機能しない場合、2 番目のクエリも機能しないことは明らかです。
コーダ
このクエリに関するガイダンスはありますか? できるだけ効率的にするといいので、[course_id、question_id] などで question_records にインデックスを付けることができます。また、「GROUP BY x.user_id」を使用する可能性がないと仮定していますが、作品にガムを追加せずに追加する方法がわかりませんでした。
ちなみに、使用しているデータベースは MySQL です。