MySQL - Select 来自关系表 A、B、C、D、E 的数据,如果在 Table F 上未找到记录

MySQL - Select data from relational tables A, B, C, D, E if record was not found on Table F

我的数据库中有 6 个 table:userscoursesusers_courseslecturesusers_lecturesattends。在标题中,我将它们称为 A、B、C、D、E 和 F。

作为学校项目的一部分,我正在创建一个讲座出席系统,我需要 运行 查询 select 仅那些用户尚未参加的讲座。

users table 包含有关用户的信息。它的table结构如下:

id INT(10) USINGNED PRIMARY KEY AUTO_INCREMENT
name VARCHAR(255)
email VARCHAR(255)
password VARCHAR(60)
created_at TIMESTAMP
updated_at TIMESTAMP

courses table 是一个 parent table 的讲座,包含有关讲座所属课程的信息。它的table结构如下:

id  INT(10) UNSIGNED AUTO_INCREMENT
name VARCHAR(255)
created_at TIMESTAMP
updated_at TIMESTAMP

users_courses 是用户和课程之间的关系 table。它将用户链接到课程。它的table结构如下:

user_id INT(10) UNSIGNED FOREIGN KEY
course_id INT(10) UNSIGNED FOREIGN KEY

lectures table 包含有关用户应该参加的即将到来的讲座的信息。它的 table 结构如下:

id INT(10)
starting_at DATETIME
ending_at DATETIME
course_id INT(10) UNSIGNED FOREIGN KEY
created_at TIMESTAMP
updated_at TIMESTAMP

users_lectures table 是用户和讲座之间的关系table。它将讲座链接到用户。它的table结构如下:

user_id INT(10) UNSIGNED FOREIGN KEY
lecture_id INT(10) UNSIGNED FOREIGN KEY

attends table 保存有关参加用户的用户 ID、讲座 ID 和 created_at 和 updated_at 的时间戳的信息。它的table结构如下:

user_id INT(10) UNSIGNED FOREIGN KEY
lecture_id INT(10) UNSIGNED FOREIGN KEY
created_at TIMESTAMP
updated_at TIMESTAMP

问题:

是否有可能通过一个查询,仅select那些用户尚未参加的即将到来的讲座?

这是我试过的方法,但 return 没有任何行:

// PHP
$stmt = $pdo->prepare("
SELECT
courses.name AS course,
lectures.id AS id,
lectures.starting_at,
lectures.ending_at,
users.name AS user_name,
users_lectures.user_id
FROM lectures
LEFT JOIN users_courses ON users_courses.course_id = lectures.course_id
LEFT JOIN courses ON courses.id = users_courses.course_id
LEFT JOIN users_lectures ON users_lectures.lecture_id = lectures.id
LEFT JOIN users ON users.id = users_lectures.user_id
LEFT JOIN attends ON attends.lecture_id = users_lectures.lecture_id
WHERE users_lectures.user_id = :user_id
AND lectures.ending_at > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 MINUTE)
AND lectures.ending_at > DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MINUTE)
AND attends.lecture_id != users_lectures.lecture_id
AND attends.user_id != :user_id
ORDER BY lectures.starting_at DESC");

我是不是遗漏了什么或者以错误的方式思考了整个结构?

很抱歉提供了这么长的文字,但我想尽可能具体。任何帮助将不胜感激:)

首先你需要从你想要的主题开始return。那就是用户。因此,这将是您从 table 到 select 的第一个(注意:为简洁起见,请使用 AS 重命名 tables):

Select *
From users AS u

下一个link一起你要的数据。取决于您想要的具体程度将取决于您需要进行多少次连接(例如 courseID 与 CourseName)。

现在假设我们需要大量人类可读的数据,例如姓名,我们将 link 以下 tables。

LEFT OUTER JOIN users_lectures AS ul ON u.id = ul.userid
LEFT OUTER JOIN lectures AS l ON l.id = ul.lectureid
LEFT OUTER JOIN courses AS c ON c.id = l.courseid
LEFT OUTER JOIN attends AS a ON a.userid = u.id AND a.lectureid = l.id

最重要的是,为了找到没有参加的人,他们不会在出席人数中table所以我们只检查出席人数为空的人。

WHERE a.userid IS NULL

附带说明一下,您不会在 WHERE 子句中得到任何结果

AND attends.lecture_id != users_lectures.lecture_id

因为您加入此声明

LEFT JOIN attends ON attends.lecture_id = users_lectures.lecture_id

自相矛盾