MySQL左外联接虚拟表
我正在处理一个相当复杂的问题,让我试着给你解释一下。以下是我的MySQL数据库中的表: 学生桌MySQL左外联接虚拟表,mysql,left-join,Mysql,Left Join,我正在处理一个相当复杂的问题,让我试着给你解释一下。以下是我的MySQL数据库中的表: 学生桌 --- `students` --- student_id first_name last_name current_status status_change_date ------------ ------------ ----------- ---------------- -------------------- 1 John
--- `students` ---
student_id first_name last_name current_status status_change_date
------------ ------------ ----------- ---------------- --------------------
1 John Doe Active NULL
2 Jane Doe Retread 2012-02-01
学生有课程表
--- `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
--- `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
学生有自选课程表
--- `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
--- `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;
我想要返回的是所有活跃或重新阅读学生的学生id、名字和姓氏,如果状态为“重新阅读”,则将这些学生的最高课程id、s_日期、e_日期和int_日期加入其中,s_日期是自状态更改日期(如果状态为“重新阅读”)。然后左键从学生有可选课程表中加入最高的可选课程、可选课程id、s\U日期和e\U日期,其中学生有可选课程。s\U日期大于或等于学生有可选课程。s\U日期和学生有可选课程。e\U日期为空
以下是返回的内容:
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
以下是我想要的回报:
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
除了一件事之外,一切都在运行,我似乎无法获得最高的学生人数。无论我如何形成查询,我都无法获得最高的学生人数
对不起,我写了这一切后自己解决了这个问题,我想这有助于我想出解决办法
以下是解决方案查询:
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;
以下是我自己调试时发现的答案:
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;
在加入之前,我需要选择和订购学生的选修课程表。我希望这有助于任何其他人寻找这样的答案。然后添加您的解决方案作为答案,并接受它。它可能会帮助其他人。