2

私はかなり複雑なクエリに取り組んでいます。それをあなたに説明しようと思います。これが私のMySQLデータベースにあるテーブルです:

学生テーブル

--- `students` ---
student_id    first_name    last_name    current_status    status_change_date
------------  ------------  -----------  ----------------  --------------------
1             John          Doe          Active            NULL
2             Jane          Doe          Retread           2012-02-01

student_have_coursesテーブル

--- `students_have_courses` ---
students_student_id    courses_course_id    s_date      e_date      int_date
---------------------  -------------------  ----------  ----------  -----------
1                      1                    2012-01-01  2012-01-04  2012-01-05
1                      2                    2012-01-05  NULL        NULL
2                      1                    2012-01-10  2012-01-11  NULL

student_have_optional_coursesテーブル

--- `students_have_optional_courses` ---
students_student_id    optional_courses_opcourse_id    s_date      e_date
---------------------  ------------------------------  ----------  ----------
1                      1                               2012-01-02  2012-01-03
1                      1                               2012-01-06  NULL
1                      5                               2012-01-07  NULL

これが私のこれまでの質問です

SELECT 
  `students_and_courses`.student_id,
  `students_and_courses`.first_name,
  `students_and_courses`.last_name,
  `students_and_courses`.courses_course_id,
  `students_and_courses`.s_date,
  `students_and_courses`.e_date,
  `students_and_courses`.int_date,
  `students_have_optional_courses`.optional_courses_opcourse_id,
  `students_have_optional_courses`.s_date,
  `students_have_optional_courses`.e_date
FROM (
  SELECT
    `c_s_a_s`.student_id,
    `c_s_a_s`.first_name,
    `c_s_a_s`.last_name,
    `c_s_a_s`.courses_course_id,
    `c_s_a_s`.s_date,
    `c_s_a_s`.e_date,
    `c_s_a_s`.int_date
 FROM (
   SELECT
      `students`.student_id,
      `students`.first_name,
      `students`.last_name,
      `students_have_courses`.courses_course_id,
      `students_have_courses`.s_date,
      `students_have_courses`.e_date,
      `students_have_courses`.int_date
    FROM
      `students`
      LEFT OUTER JOIN `students_have_courses`
        ON (
          `students_have_courses`.`students_student_id` = `students`.`student_id` AND     (( 
          `students_have_courses`.`s_date` >= `students`.`status_change_date` AND
          `students`.current_status = 'Retread' ) OR
          `students`.current_status = 'Active')
        )
      WHERE
        `students`.current_status = 'Active' OR
        `students`.current_status = 'Retread'
  ) `c_s_a_s`
  ORDER BY
    `c_s_a_s`.`courses_course_id` DESC
) `students_and_courses`
LEFT OUTER JOIN `students_have_optional_courses`
  ON (
    `students_have_optional_courses`.students_student_id =     `students_and_courses`.student_id AND
    `students_have_optional_courses`.s_date >= `students_and_courses`.s_date AND 
    `students_have_optional_courses`.e_date IS NULL
  )
GROUP BY
 `students_and_courses`.student_id;

返されるのは、すべてのアクティブまたはリトレッドの学生のstudent_id、first_name、およびlast_nameであり、ステータスが'Retreadの場合、s_dateがstatus_change_date以降である学生の最高のcourse_id、s_date、e_date、およびint_dateにLEFTJOINします。 '。次に、students_have_optional_courses.s_dateがstudents_have_courses.s_date以上で、students_have_optional_courses.e_dateがNULLであるstudents_have_optional_courses TABLEの最高のoptional_courses_opcourse_id、s_date、およびe_dateを左に結合します。

返されるものは次のとおりです。

student_id    first_name    last_name    courses_course_id    s_date      e_date      int_date      optional_courses_opcourse_id    s_date_1    e_date_1
------------  ------------  -----------  -------------------  ----------  ----------  ------------  ------------------------------  ----------  ----------
1             John          Doe          2                    2012-01-05  NULL        NULL          1                               2012-01-06  NULL
2             Jane          Doe          NULL                 NULL        NULL        NULL          NULL                            NULL        NULL

これが私が返されたいものです:

student_id    first_name    last_name    courses_course_id    s_date      e_date      int_date      optional_courses_opcourse_id    s_date_1    e_date_1
------------  ------------  -----------  -------------------  ----------  ----------  ------------  ------------------------------  ----------  ----------
1             John          Doe          2                    2012-01-05  NULL        NULL          5                               2012-01-07  NULL
2             Jane          Doe          NULL                 NULL        NULL        NULL          NULL                            NULL        NULL

1つを除いてすべてが機能しています。クエリをどのように作成しても、最高のstudents_have_optional_courses.optional_courses_opcourse_idを取得できないようです。

申し訳ありませんが、これをすべて書き終えた後、自分で解決しました。解決策を考えるのに役立ったと思います。

ソリューションクエリは次のとおりです。

    SELECT 
      `students_and_courses`.student_id,
      `students_and_courses`.first_name,
      `students_and_courses`.last_name,
      `students_and_courses`.courses_course_id,
      `students_and_courses`.s_date,
      `students_and_courses`.e_date,
      `students_and_courses`.int_date,
      `students_optional_courses`.optional_courses_opcourse_id,
      `students_optional_courses`.s_date,
      `students_optional_courses`.e_date
    FROM (
      SELECT
        `c_s_a_s`.student_id,
        `c_s_a_s`.first_name,
        `c_s_a_s`.last_name,
        `c_s_a_s`.courses_course_id,
        `c_s_a_s`.s_date,
        `c_s_a_s`.e_date,
        `c_s_a_s`.int_date
      FROM (
        SELECT
          `students`.student_id,
          `students`.first_name,
          `students`.last_name,
          `students_have_courses`.courses_course_id,
          `students_have_courses`.s_date,
          `students_have_courses`.e_date,
          `students_have_courses`.int_date
        FROM
          `students`
          LEFT OUTER JOIN `students_have_courses`
            ON (
              `students_have_courses`.`students_student_id` = `students`.`student_id` AND (( 
              `students_have_courses`.`s_date` >= `students`.`status_change_date` AND
              `students`.current_status = 'Retread' ) OR
              `students`.current_status = 'Active')
            )
          WHERE
            `students`.current_status = 'Active' OR
            `students`.current_status = 'Retread'
      ) `c_s_a_s`
      ORDER BY
        `c_s_a_s`.`courses_course_id` DESC
    ) `students_and_courses`
    LEFT OUTER JOIN (
      SELECT
        *
      FROM
        `students_have_optional_courses`
      ORDER BY
        `students_have_optional_courses`.optional_courses_opcourse_id DESC
    ) `students_optional_courses`
      ON (
        `students_optional_courses`.students_student_id = `students_and_courses`.student_id AND
        `students_optional_courses`.s_date >= `students_and_courses`.s_date AND 
        `students_optional_courses`.e_date IS NULL
      )
    GROUP BY
     `students_and_courses`.student_id;
4

1 に答える 1

2

これを自分でデバッグしているときに見つけた答えは次のとおりです。

    SELECT 
      `students_and_courses`.student_id,
      `students_and_courses`.first_name,
      `students_and_courses`.last_name,
      `students_and_courses`.courses_course_id,
      `students_and_courses`.s_date,
      `students_and_courses`.e_date,
      `students_and_courses`.int_date,
      `students_optional_courses`.optional_courses_opcourse_id,
      `students_optional_courses`.s_date,
      `students_optional_courses`.e_date
    FROM (
      SELECT
        `c_s_a_s`.student_id,
        `c_s_a_s`.first_name,
        `c_s_a_s`.last_name,
        `c_s_a_s`.courses_course_id,
        `c_s_a_s`.s_date,
        `c_s_a_s`.e_date,
        `c_s_a_s`.int_date
      FROM (
        SELECT
          `students`.student_id,
          `students`.first_name,
          `students`.last_name,
          `students_have_courses`.courses_course_id,
          `students_have_courses`.s_date,
          `students_have_courses`.e_date,
          `students_have_courses`.int_date
        FROM
          `students`
          LEFT OUTER JOIN `students_have_courses`
            ON (
              `students_have_courses`.`students_student_id` = `students`.`student_id` AND (( 
              `students_have_courses`.`s_date` >= `students`.`status_change_date` AND
              `students`.current_status = 'Retread' ) OR
              `students`.current_status = 'Active')
            )
          WHERE
            `students`.current_status = 'Active' OR
            `students`.current_status = 'Retread'
      ) `c_s_a_s`
      ORDER BY
        `c_s_a_s`.`courses_course_id` DESC
    ) `students_and_courses`
    LEFT OUTER JOIN (
      SELECT
        *
      FROM
        `students_have_optional_courses`
      ORDER BY
        `students_have_optional_courses`.optional_courses_opcourse_id DESC
    ) `students_optional_courses`
      ON (
        `students_optional_courses`.students_student_id = `students_and_courses`.student_id AND
        `students_optional_courses`.s_date >= `students_and_courses`.s_date AND 
        `students_optional_courses`.e_date IS NULL
      )
    GROUP BY
     `students_and_courses`.student_id;

LEFT JOININGの前に、students_have_optional_coursesテーブルを選択して注文する必要がありました。これが、そのような答えを探している他の人の助けになることを願っています。

于 2012-11-13T17:11:09.550 に答える