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:users
、courses
、users_courses
、lectures
、users_lectures
和 attends
。在标题中,我将它们称为 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
自相矛盾
我的数据库中有 6 个 table:users
、courses
、users_courses
、lectures
、users_lectures
和 attends
。在标题中,我将它们称为 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
自相矛盾