2013-02-14 149 views
0

我有一個答案表,列出了給定問題的可能答案。左連接多組表格

possible_answer 
id question_id text 
1 1   yes 
2 1   no 
3 2   red 
4 2   blue 
5 2   green 

然後,我有用戶給

user_answer 
id user_id answer_id 
1 10  1 
2 10  3 
3 11  1 
4 11  4 
5 12  2 
6 12  5 

我想創建一個MySQL查詢,將顯示我的用戶名答案的表,用戶的問題1回答(可能爲空)和用戶對問題2的回答(可能爲空)。我陷入困境,因爲我覺得我需要將多個LEFT JOIN分組在一起,但是我得到的輸出給了我一個答案,或者兩個列中都有相同的答案。

這裏就是我在這一點上有:

SELECT u.name, pa1.text, pa2.text 
FROM user u 
LEFT JOIN user_answer ua1 ON u.id = ua1.user_id 
LEFT JOIN possible_answer pa1 ON ua1.answer_id = pa1.id AND pa1.question_id = 1 
LEFT JOIN user_answer ua2 ON u.id = ua2.user_id 
LEFT JOIN possible_answer pa2 ON ua2.answer_id = pa2.id AND pa2.question_id = 2 
GROUP BY u.id; 

我得到的結果,如:

username pa1.text pa2.text 
user1  yes  NULL 
user2  no  NULL 
user3  NULL  blue 

當我知道有這兩個問題給定用戶的條目。

我在那裏group by,因爲當我沒有group by我得到這樣的結果(這是八九不離十接近預期的結果),但他們並沒有出現顯示任何類型的模式:

username pa1.text pa2.text 
    user1  yes  NULL 
    user1  NULL  red 
    user2  no  NULL 
    user2  NULL  NULL 
    user3  no  NULL 
    user3  NULL  blue 

任何想法將不勝感激。

+1

*有什麼想法?*你得到你所要求的。 user1對問題1回答「是」。用戶1對問題2沒有回答,因此顯示NULL,因爲PA2.text是「否」,但UA2.answer_ID對於該文本爲空。因此你得到NULL。因此,如果您要列出所有問題的列表,可能的答案以及每個用戶提供的答案。你需要從問題開始,左側加入可能的答案,然後左側加入到用戶的答案中。在這個地方,右連接可以工作,但你必須找出正確的順序。要真正提供答案,我需要知道你想要什麼輸出。 – xQbert 2013-02-14 20:08:32

+0

準備完成的'group by'是什麼? – Matthew 2013-02-14 20:10:33

+0

@xQbert問題是這些值實際上不是null。用戶1確實有問題2的答案。 NULL應該顯示值,因爲在這個例子中,每個用戶都回答了這兩個問題。 (儘管我所展示的假數據可能並不真實反映這一點) – Chris 2013-02-14 20:19:42

回答

0

這是什麼結束了工作。

SELECT DISTINCT u.name, 

(SELECT pa1.text FROM possible_answer pa1, user_answer ua WHERE ua1.user_id = u.id AND ua1.answer_id = pa1.id AND pa1.question_id = 1 ORDER BY ua1.id DESC LIMIT 1) as 'Question1', 

(SELECT pa2.text FROM possible_answer aa2, user_answer ua2 WHERE ua2.user_id = u.id AND ua2.answer_id = pa2.id AND pa.question_id = 2 ORDER BY ua.id DESC LIMIT 1) as 'Question2' 

FROM user u 
GROUP BY u.id; 
0

也許這是更接近你以後有什麼...

Select UA.User_ID, PA.Question_ID, UA.Answer_ID, PA.Text 
FROM Possible_Answer PA 
LEFT JOIN user_Answer UA on PA.ID = UA.Answer_ID 
ORDER BY PA.Question_ID, UA.User_ID 

返回所有可能的答案,任何用戶提供了一個問題的答案,和文本。但它會爲每個用戶重複提問/回答。

0

如果只有兩種可能,你可以使用這一招:

select ua.user_id, 
     min(pa.text) as answer1, 
     (case when min(pa.text) <> max(pa.text) then max(pa.text) end) as answer2 
from possible_answer pa join 
    user_answer ua 
    on pa.id = ua.answer_id 
group by ua.user_id 

這失去基礎上user_answer ID中的排序。如果訂購非常重要,那麼請採取min(id)max(id)並返回possible_answer以獲得正確的值。

0

我知道這更多的是一種黑客攻擊,但也許這將在動態查詢工作:

select z.username, w.text as PA1, x.text as PA2 
from user z 
join 
    (select a.user_id, b.question_id, b.text, a.answer_id 
    from 
    user_answer a join possible_answer b on a.answer_id=b.id) as w 
    on w.user_id=z.user_id 
    and w.question_id=1 

join 
    (select a.user_id, b.question_id, b.text, a.answer_id 
    from 
    user_answer a join possible_answer b on a.answer_id=b.id) as x 
    on x.user_id=z.user_id 
    and x.question_id=2 
0

我與SQL Server的工作,所以寫的查詢與SQL Server的語法。但我相信同樣的查詢也將在MySQL中工作(可能會有一些變化)。

如果您想獲得結果,您需要將行數據轉換爲列。 在SQL Server,你可以使用CASE語句(甲骨文DECODE,MySQL的不知道,但情況下也說不定)

查詢

SELECT u.Name, 
MAX(CASE WHEN pa1.QuestionID=1 THEN pa1.Text ELSE NULL END) AS Question1_answer, 
MAX(CASE WHEN pa1.QuestionID=2 THEN pa1.Text ELSE NULL END) AS Question2_answer 
FROM Users u 
LEFT JOIN UserAnswers ua1 ON ua1.UserID=u.ID 
LEFT JOIN PossibleAnswers pa1 ON pa1.ID=ua1.AnswerID 
GROUP BY u.Name 

分組依據名稱,因爲我們希望在一排的問題, 所以用分組通過名稱和一行

這裏的鏈接添加

MAX(...) 

一個用戶的答案,我們組的答案列到SqlFiddler我試圖創建一個相同的情況 http://sqlfiddle.com/#!3/b2357/10