2013-08-17 27 views
0

兩個表格,一個包含問題,另一個包含每個用戶的答案,如果他們已經回答的話。我試圖拉取由權重(最重要)排序的下一個問題,其中用戶a在答案表中沒有答案。令人不安的MySQL加入操作

我的表是這樣的:

table: app_questions 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| owneruid | int(11)  | YES |  | NULL |    | 
| question | varchar(350) | YES |  | NULL |    | 
| answer_1 | varchar(350) | YES |  | NULL |    | 
| answer_2 | varchar(350) | YES |  | NULL |    | 
| answer_3 | varchar(350) | YES |  | NULL |    | 
| answer_4 | varchar(350) | YES |  | NULL |    | 
| weight | decimal(5,2) | YES |  | NULL |    | 
| datetime | datetime  | YES |  | NULL |    | 

table: app_answers 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 
| uid    | int(11)  | YES |  | NULL |    | 
| quid    | int(11)  | YES |  | NULL |    | 
| answer    | int(11)  | YES |  | NULL |    | 
| importance   | int(11)  | YES |  | NULL |    | 
| answer_status  | varchar(20) | YES |  | NULL |    | 
| answer_explanation | varchar(200) | YES |  | NULL |    | 
| datetime   | datetime  | YES |  | NULL |    | 

我已經嘗試了一些變化,但還沒有得到正是我需要的:

SELECT uid , 
     question , 
     answer_1 , 
     answer_2 , 
     answer_3 , 
     answer_4 , 
     weight , 
     answer_status 
FROM match_questions 
     LEFT JOIN match_answers ON match_questions.id = match_answers.quid 
WHERE answer_status IS NULL 
     AND EXISTS (SELECT * 
        FROM match_answers 
        WHERE uid = 1) 
ORDER BY weight DESC LIMIT 1; 



    SELECT uid , 
     question , 
     answer_1 , 
     answer_2 , 
     answer_3 , 
     answer_4 , 
     weight , 
     answer_status 
FROM match_questions 
     LEFT JOIN match_answers ON match_questions.id = match_answers.quid 
WHERE uid IS NULL 
     AND answer_status IS NULL 
ORDER BY weight DESC LIMIT 1; 




SELECT uid , 
      question , 
      answer_1 , 
      answer_2 , 
      answer_3 , 
      answer_4 , 
      weight , 
      answer_status 
    FROM match_questions 
      LEFT JOIN match_answers ON match_questions.id = match_answers.quid 
    WHERE answer_status IS NULL 
      AND uid IS NULL 
    ORDER BY weight DESC LIMIT 1; 

任何指導讚賞。

+0

你可以創建一個sqlfiddle例子,我想做到這一點,但沒有樣本數據,你可以複製和使用它http://www.sqlfiddle.com/#!2/68aed – skv

+0

樣本數據和樣本(所需)輸出將使它更容易回答這個問題。 – spencer7593

+0

感謝球員,peterm設法幫助。我將來會使用sqlfiddle。 – Jared

回答

2

這很難說沒有看到樣本數據和期望的輸出,但恕我直言,您的查詢可能是這樣

SELECT q.id, 
     q.question, 
     q.answer_1, 
     q.answer_2, 
     q.answer_3, 
     q.answer_4, 
     q.weight 
    FROM match_questions q LEFT JOIN match_answers a 
    ON q.id = a.quid 
    AND a.uid = 1 
WHERE a.quid IS NULL 
ORDER BY q.weight, q.id 
LIMIT 1 

這裏是SQLFiddle演示

+0

這是票。感謝您的幫助!我也不知道sqlfiddle是否存在,但這很好,下一次我需要幫助時,我會使用它並添加一些示例數據。 – Jared

+1

+1這是一個「反連接」模式。一個左連接,返回所有問題以及匹配答案,然後是一個謂詞以消除所有匹配的行,所以我們留下的行沒有匹配。 (我將列引用'uid'限定爲'a.uid'作爲未來讀者的幫助,並且在有人在問題表上添加了'uid'列時防止出現「模糊列」錯誤。) – spencer7593

+0

非常歡迎。我很高興我可以幫助:) – peterm