2014-03-30 58 views
1

我有一個名爲'users'的表名爲'modules',名爲'users_modules'的表。SQL:多個聯接和WHERE語句

'users'包含'user_id','first_name','last_name'和'role'。

'模塊'包含'module_code'和'module_title'。

「users_modules」包含「USER_ID」和「module_code」

的「角色」列中的「用戶」表specifys如果該用戶是「學生」,「講師」或「管理」。

我想向用戶展示他們正在研究的模塊,包括模塊代碼,模塊標題以及此模塊的講師名稱。

我已經設法對以下語句給出了'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表。我知道我需要爲用戶表做另一個JOIN,所以我可以得到講師的姓名,但不知道如何完成編寫代碼。

代碼將不得不檢查哪些用戶註冊了該模塊(使用users_module表),然後查看他們中的任何用戶是否具有'角色'(users表中的列),該角色等於'Lecturer'或「管理員」。


概述的我想要的:

由此顯示了學生它們參加和講師教授本章什麼什麼模塊(在該示例中與USER_ID = 2學生)。

對於每個參與此模塊的人(無論是老師還是學生)都會在'users_modules'中有一個記錄。

我需要一種方法來從每個模塊的講師中抽出'users_modules'表,這是通過查看users表中的'role'列完成的。

+0

爲什麼'用戶'表沒有'user_id'字段? – SS781

+0

它的確如此,我寫錯的時候會出錯,現在會更新。 –

回答

1

下面應該爲你提供你所需要的,假設你的用戶表有一個'user_id'字段。另外請注意,在查詢中爲表格添加別名總是一個好習慣。

 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 
     ; 
+0

@傑克布朗,這是否產生一個輸出? – SS781

+0

Hi @ SS781,目前給我:#1064 - 你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第1行的AND(u2.role ='Lecturer'或u2.role ='Admin')'附近使用正確的語法。 –

+0

只有一個額外的分號,現在修復 – SS781

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; 
+0

如何才能選擇角色爲'講師'或'管理員'的用戶的名字和姓氏? –

+0

@JackBrown,我更新了 –

+0

@JackBrown,你可以在'WHERE'子句和'JOIN'的ON子句中應用你的條件。選擇字段設置是一個簡單的枚舉,你想在'SELECT'子句中使用什麼。 –

0

這很簡單。如果您的模塊始終有講師在最後一次加入(和ON)下添加另一個INNER JOIN語句。該連接將在module_code上。如果某些模塊沒有講師,那麼請使用LEFT JOIN,否則將刪除您想要查看的行。