SQL:多个联接和WHERE语句

时间:2014-03-30 18:23:41

标签: mysql sql

我有一个名为'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'列来完成。

3 个答案:

答案 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,否则将删除您可能希望看到的行。