在这个SQL中需要帮助
SELECT mdl_course_completions.course, mdl_course.fullname, mdl_course_completions.userid, mdl_user_enrolments.userid, mdl_user_enrolments.enrolid
FROM mdl_course_completions
LEFT JOIN mdl_course ON mdl_course_completions.course = mdl_course.id
LEFT JOIN mdl_user_enrolments ON mdl_course_completions.userid = mdl_user_enrolments.userid
WHERE mdl_user_enrolments.enrolid IN
(SELECT mdl_enrol.id from mdl_enrol where mdl_enrol.courseid = mdl_course_completions.course)
在mdl_course_completions表中,我们有3122条记录,其中1471条是mdl_user_enrolment中的相关记录。对于剩下的3122-1471条(1651条),仍然应该提取mdl_course_completions.course, mdl_course.fullname & mdl_course_completions.userid, mdl_user_enrolments.enrolid下的空白字段的数据。
本系统没有定义适当的外键,因此关系的使用在不同的表之间没有得到相同的维护,因此要从mdl_user_enrolment中获取记录需要有select子句。
谁能帮忙解决一下。欣赏一样。
当你在WHERE子句中提到一个来自LEFT JOINed表的列时,你把LEFT JOIN转换为普通的内部JOIN,所以抑制了不匹配的行。ON
子句的结果集。
...
LEFT JOIN mdl_user_enrolments
ON mdl_course_completions.userid = mdl_user_enrolments.userid
WHERE mdl_user_enrolments.enrolid IN
(SELECT mdl_enrol.id
from mdl_enrol
where mdl_enrol.courseid = mdl_course_completions.course)
试着将WHERE重构为另一个LEFT JOIN子句,就像这样
...
LEFT JOIN mdl_user_enrolments
ON mdl_course_completions.userid = mdl_user_enrolments.userid
LEFT JOIN md_enrol
ON md_enrol.courseid = mdl_course_completions.course
看看你是否得到了正确的结果集。
而且,恕我直言,试着告诉MySQL、MariaDB和PostgreSQL开源开发团队,他们的产品不是合适的RDBMS。我怀疑他们会不同意。