私はまだSQLにかなり慣れていないので、コードの問題がどこから来ているのか完全には理解していません. 以下のコードはほとんど私の仕事から来ているので、最初から書いたわけではありません。コードはさまざまな情報を収集し、それに基づいてフィルター処理します。コードを見ると、学生には関連する多くのobservations_studentsがあることがわかります。コードの最初のバージョンは、observation_id = 2567 のobservations_student を持つすべての生徒の情報を返します。これは、次のコードで正しく動作するようです。
SELECT DISTINCT
SUBSTRING(s.osis_id,INSTR(s.osis_id,'-')+1) AS osid,
s.id AS student_id,
CONCAT(s.last_name, ' ',s.first_name) AS sname
FROM students s
# course info
INNER JOIN
(
SELECT c.id AS cid,
c.description AS cname,
cs.date_end,
cs.student_id,
gl.description AS grade,
c.gradelevel_id
FROM courses_students cs
INNER JOIN courses c ON c.id = cs.course_id
INNER JOIN gradelevels gl ON gl.id = c.gradelevel_id
WHERE
IFNULL(cs.date_end, NOW()) >= NOW()
AND IFNULL(c.date_end, NOW()) >= NOW()
AND c.school_id = 1509
AND c.subject_id = 24
) AS cs ON cs.student_id = s.id
# RTI flag info
INNER JOIN
(
SELECT os.id,
os.student_id
FROM observations o
INNER JOIN observations_students os ON os.observation_id = 2567
WHERE
o.school_id = 1509
) AS os ON os.student_id = s.id
LEFT JOIN schools_students ss ON ss.student_id = s.id
WHERE s.active = 1
AND ss.school_id = 1509
AND IFNULL(ss.date_end,NOW()) >= NOW()
AND cs.gradelevel_id BETWEEN 10 AND 16
この後に私がやりたいことは、2567 の観測値を持つこれらの学生のそれぞれについて、その学生が持っている 2009 の観測値の数を見つけたいと思います。これを行うために、別の LEFT JOIN を追加しています。完成したコードは次のようになります。
SELECT DISTINCT
SUBSTRING(s.osis_id,INSTR(s.osis_id,'-')+1) AS osid,
s.id AS student_id,
CONCAT(s.last_name, ' ',s.first_name) AS sname,
COUNT(fdos.id) AS fd_count
FROM students s
# course info
INNER JOIN
(
SELECT c.id AS cid,
c.description AS cname,
cs.date_end,
cs.student_id,
gl.description AS grade,
c.gradelevel_id
FROM courses_students cs
INNER JOIN courses c ON c.id = cs.course_id
INNER JOIN gradelevels gl ON gl.id = c.gradelevel_id
WHERE
IFNULL(cs.date_end, NOW()) >= NOW()
AND IFNULL(c.date_end, NOW()) >= NOW()
AND c.school_id = 1509
AND c.subject_id = 24
) AS cs ON cs.student_id = s.id
# RTI flag info
INNER JOIN
(
SELECT os.id,
os.student_id
FROM observations o
INNER JOIN observations_students os ON os.observation_id = 2567
WHERE
o.school_id = 1509
) AS os ON os.student_id = s.id
LEFT JOIN
(
SELECT fdos.id,
fdos.student_id
FROM observations o
INNER JOIN observations_students fdos ON fdos.observation_id = 2009
WHERE
o.school_id = 1509
) AS fdos ON fdos.student_id = s.id
LEFT JOIN schools_students ss ON ss.student_id = s.id
WHERE s.active = 1
AND ss.school_id = 1509
AND IFNULL(ss.date_end,NOW()) >= NOW()
AND cs.gradelevel_id BETWEEN 10 AND 16
「COUNT(fdos.id) AS fd_count」を「fdos.id AS fdosid」に変更すると、正しいエントリ数が返されます。ただし、COUNT から返される数値は同じ数値ではなく、正しくありません。私が間違っていることを説明するのに十分なほど、ここで何が起こっているのか誰でも理解できますか?
お時間をいただきありがとうございます。