2012-02-15 120 views
0

我正在構建一個我希望生成統計數據的在線調查系統。我希望根據用戶的性別進行查詢。我有以下表格:SQL連接多個表

  • survey_question_options
  • survey_answer
  • 用戶

我已經構建了以下查詢,以便它帶回那裏有這個問題沒有答案空響應:

SELECT COUNT(sa.option_id) AS answer , so.option_label 
FROM survey_answer sa 
RIGHT JOIN survey_question_options so 
     ON sa.option_id = so.option_id AND 
      sa.record_date>='2011-09-01' AND 
      sa.record_date<='2012-08-01' 
LEFT JOIN users u 
     ON (sa.uid = u.uid AND u.gender='F') 
WHERE so.question_id=24 
GROUP BY so.option_label 
ORDER BY so.option_id ASC 

我的查詢返回的結果如下設置:

0 Red 
1 Yellow 
0 Blue 
0 Green 

但是,查詢中忽略了LEFT JOIN中的性別條件。當我將性別更改爲'M'時,返回相同的結果。但是,對於一切,預期的結果將是0。

我不知道我要去的地方錯了。請幫忙。

在此先感謝。

回答

0

的左連接到用戶表後評估聯接到回答表 - 所以雖然如果用戶是錯誤的性別,答案記錄返回(不管是不是返回用戶記錄用戶的性別)。嘗試:

SELECT COUNT(sa.option_id) AS answer , so.option_label 
FROM (select a.option_id 
     from survey_answer a 
     JOIN users u ON a.uid = u.uid AND u.gender='F' 
     where a.record_date>='2011-09-01' AND 
      a.record_date<='2012-08-01') sa 
RIGHT JOIN survey_question_options so 
     ON sa.option_id = so.option_id 
WHERE so.question_id=24 
GROUP BY so.option_label 
ORDER BY so.option_id ASC 
1

那麼,你是從主表中的列做一個COUNT,等等LEFT JOIN性別條件不會影響結果。您應該在users表的列上執行COUNT。我不確定這是否是您想要的,但您應該嘗試:

SELECT COUNT(u.uid) AS answer , so.option_label 
FROM survey_answer sa 
RIGHT JOIN survey_question_options so 
     ON sa.option_id = so.option_id AND 
      sa.record_date>='2011-09-01' AND 
      sa.record_date<='2012-08-01' 
LEFT JOIN users u 
     ON (sa.uid = u.uid AND u.gender='M') 
WHERE so.question_id=24 
GROUP BY so.option_label 
ORDER BY so.option_id ASC 
0

您正在將您的狀況置於錯誤的塊中。由於您正在執行LEFT JOIN(這是一個左邊界外部連接),所以左邊表格(主表格)中的所有內容都與連接表格(適用)中的數據一起選定。你想要的是從全部users添加數據,然後限制查詢的完整輸出。您實際上做的是僅添加來自女性用戶的用戶數據,然後顯示所有數據。

聲音是技術性的,但您所要做的就是將AND u.gender='F'移至主要的WHERE子句中,而不是ON子句。這將導致SQL僅在發生JOIN後爲女性用戶選擇行。