需要帮助在MySQL中的Where子句中使用连接和选择语句[重复]。

问题描述 投票:1回答:1

在这个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子句。

谁能帮忙解决一下。欣赏一样。

mysql left-join where-clause moodle
1个回答
0
投票

当你在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。我怀疑他们会不同意。

© www.soinside.com 2019 - 2024. All rights reserved.