2012-07-18 131 views
0

我有兩個select語句我想合併成一個,但我真的只需要第二個select語句中的一個字段的信息(來自user_info_data的字段data)。我需要的字段是名字,姓氏,電子郵件,課程全名,角色和字段data其中fieldid ='15'。第一個選擇語句會給我一切,但數據字段。第二個給我的東西除了課程。我試着做第二個選擇語句類似於角色字段,但它抱怨它返回多個行。如果我嘗試只使用沒有fieldid = '15'部分的課程名稱,它會帶來超過10萬條記錄(每個用戶在每個課程中都顯示出來,並顯示他們的所有數據)。多個mysql連接,如何結合這兩個select語句

的字段的表:

user(id,auth,confirmed,policyagreed,username,password,idnumber,firstname,lastname,email,phone etc..) 
user_info_data(id,userid,fieldid,data) 
role(id,name,shortname,description,sortorder) 
role_assignments(id,roleid,contextid,userid...) 
context(id,contextlevel,instanceid,path,depth) 

首先聲明:

名字姓氏電子郵件課程角色

李四john.doe:第一stament的

SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, course.fullname AS Course, role.name AS Role 
FROM user AS user, course AS course,role,role_assignments AS asg 
INNER JOIN context AS context ON asg.contextid=context.id 
WHERE context.contextlevel = 50 
AND role.id=asg.roleid 
AND user.id=asg.userid 
AND context.instanceid=course.id 

輸出@ email.com課程-N AME學生

其次聲明:

名字姓氏電子郵件IBCLC認證

李四[email protected]

:第二stament的

SELECT user.firstname AS 'First Name', user.lastname AS 'Last Name', user.email AS 'Email', user_info_data.data AS 'IBCLC Certified' 
FROM user, user_info_data 
WHERE user.id = user_info_data.userid 
AND fieldid = '15' 

輸出所需輸出:

名字,姓氏,電子郵件,IBCLC認證,當然,角色

其他select語句我想:調出9494條記錄,但現在哪裏fieldid是15場的數據是可能的選擇列表,能那是爲什麼?

SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, userdata.data, course.fullname AS Course, role.name AS Role 
FROM user AS user, course AS course, user_info_data AS userdata, role,role_assignments AS asg 
INNER JOIN context AS context ON asg.contextid=context.id 
WHERE context.contextlevel = 50 
AND userdata.fieldid = 15 
AND role.id=asg.roleid 
AND user.id=asg.userid 
AND context.instanceid=course.id 
+0

在您嘗試的select語句上,爲什麼不直接在FROM子句中添加'role'而不是使用嵌入式select語句呢? – northpole 2012-07-18 14:39:41

+0

@northpole工作,並帶來了與第一個聲明相同的結果,但我仍然不知道如何獲得fieldid = 15的字段'data',而沒有113974條記錄;應該只有94. – Jonathan 2012-07-18 14:53:16

+0

@johathan - 你是說只有94行fieldid = 15?這是你減少這張桌子的唯一的東西。它應該加入以用戶名來說用戶嗎?在我看來,你可能會錯過附加的where子句。 – northpole 2012-07-18 15:12:18

回答

1

我添加user_info_data你的第一個要求是這樣的:

SELECT user.firstname AS Firstname, 
     user.lastname AS Lastname, 
     user.email AS Email, 
     course.fullname AS Course, 
     role.name AS Role, 
     ibclcCert.data AS 'IBCLC Certified' 
FROM user, 
    course, 
    role, 
    role_assignments AS asg, 
    context, 
    user_info_data AS ibclcCert 
WHERE context.contextlevel = 50 
    AND role.id=asg.roleid 
    AND user.id=asg.userid 
    AND context.instanceid=course.id 
    AND asg.contextid=context.id 
    AND ibclcCert.userid = user.id 
    AND ibclcCert.fieldid = '15' 

我改名爲user_info_data表參照的東西表示在這種情況下,實際現場,ibclcCert。如果您有一天想要訪問多個數據字段,則此重命名是一項規定。當你這樣做時,你會多次包括這個表格,每個表格都需要一個表格。另請參閱this answer關於如何處理此類數據格式。

+0

我試過了,並收到了這個錯誤:#1054 - 'on子句'中的未知列'user.id' – Jonathan 2012-07-18 15:12:53

+0

數據庫中是否有'user.id'列?你的第二個查詢使用一個,但是錯誤說沒有一個。哪個是對的? – MvG 2012-07-18 15:21:29

+0

是的,有。用戶'1個\t ID \t BIGINT(10)\t \t UNSIGNED \t沒有\t無\t AUTO_INCREMENT'我得到了我和角色扮演時,前一個類似的錯誤,我打開我使用他們的順序和「爲每個人一個記錄」它走了? – Jonathan 2012-07-18 15:24:03