我有一个名为'users'的表格,一个名为'modules'的表和一个名为'users_modules'的表。
'users'包含'user_id','first_name','last_name'和'role'。
'modules'包含'module_code'和'module_title'。
'users_modules'包含'user_id'和'module_code'
'users'表中的'role'列指定该用户是“学生”,“讲师”还是“管理员”。
我想向用户显示他们正在学习哪些模块,包括模块代码,模块标题以及该模块讲师的姓名。
我设法纠正了下面的语句,它给了我某个用户正在研究的所有模块的'module_code'和'module_title'。
SELECT users_modules.user_id,
users_modules.module_code,
modules.module_title
FROM users_modules
INNER JOIN modules
ON users_modules.module_code = modules.module_code
WHERE user_id = 2;
我现在需要显示为此模块注册的讲师。需要成为上述语句的一部分,因为我在PHP while循环中使用它来生成HTML表。我知道我需要为users表做另一个JOIN,这样我就可以得到讲师的名字,但不知道如何完成代码编写。
代码必须检查哪些用户注册了该模块(使用users_module表),然后查看其中任何一个用户是否具有“角色”(users表中的列),其等于“Lecturer”或“管理员。
我想要的概述:
显示学生(在此示例中为user_id = 2的学生)注册了哪些模块以及讲授该模块的讲师的结果。
对于参与此模块(教师或学生)的每个人,都会在'users_modules'中有记录。
我需要一种方法来从每个模块的讲师中拉出'users_modules'表,这可以通过查看users表中的'role'列来完成。
答案 0 :(得分:1)
假设您的用户表格中有一个&user.did'以下内容可以为您提供所需内容。领域。另请注意,在查询中对表进行别名总是一个好习惯。
SELECT u1.user_id AS 'Student ID', um1.module_code, m1.module_title,
GROUP_CONCAT(u2.first_name) AS 'Lecturer First Name',
GROUP_CONCAT(u2.last_name) AS 'Lecturer Last Name'
FROM users u1 INNER JOIN users_modules um1 ON u1.user_id = um1.user_id
INNER JOIN modules m1 ON um1.module_code = m1.module_code
INNER JOIN users_modules um2 ON m1.module_code = um2.module_code
INNER JOIN users u2 ON um2.user_id = u2.user_id
WHERE u1.user_id = 2
AND (u2.role = 'Lecturer' or u2.role = 'Admin')
GROUP BY u1.user_id, um1.module_code, m1.module_title
;
答案 1 :(得分:0)
只需添加其他联接和必填字段:
SELECT users_modules.user_id,
users_modules.module_code,
modules.module_title,
users.first_name,
users.last_name
FROM users_modules
INNER JOIN modules
ON users_modules.module_code = modules.module_code
INNER JOIN users
ON user.user_id = users_modules.user_id
WHERE users_modules.user_id = 2 AND users.role IN ('Lecturer', 'Admin');
或者加入条件:
SELECT um.user_id,
um.module_code,
m.module_title,
u.first_name,
u.last_name
FROM users_modules um
INNER JOIN modules m
ON um.module_code = m.module_code
INNER JOIN users u
ON u.user_id = um.user_id
AND u.role IN ('Lecturer', 'Admin')
WHERE um.user_id = 2;
答案 2 :(得分:0)
非常简单。如果您的模块总是有讲师在最后一个连接(和ON)下添加另一个INNER JOIN语句。连接将在module_code上。如果某些模块没有讲师,那么请选择LEFT JOIN,否则将删除您可能希望看到的行。