2013-10-07 210 views
0

我真的不確定如何最好地去寫這個查詢。我有3個表,我需要運行一個查詢從其中抽取數據,根據其他條件。基於與其他表的條件從表中選擇數據

表:調查,survey_countries,survey_categories

調查
ID | survey_id | network_id

survey_countries
id | survey_id | network_id |國家

survey_categories: ID | survey_id | network_id |類別

(survey_countries和survey_categories中的survey_id與調查表中的survey_id列相關,與id列相對)。

我需要從特定國家和特定類別的調查中檢索數據。然後我需要能夠將UNION用於其他類別,但我想我可以稍後再做。我的嘗試:

SELECT surveys.* 
FROM survey_countries 
LEFT JOIN surveys ON survey_countries.survey_id = surveys.survey_id ANd survey_countries.network_id = surveys.network_id 
LEFT JOIN survey_categories ON survey_countries.survey_id = surveys.survey_id AND survey_categories.network_id = surveys.network_id 
WHERE survey_countries.country = 'GB' 
AND survey_categories.category = 'my_category' 
GROUP BY surveys.id 

謝謝!

編輯:下面似乎工作:

SELECT s.*, ca.category, co.country 
FROM surveys s 
LEFT JOIN survey_countries co ON s.survey_id = co.survey_id AND s.network_id = co.network_id 
LEFT JOIN survey_categories ca ON s.survey_id = ca.survey_id AND s.network_id = ca.network_id 
WHERE ca.category = 'uncategorised' 
AND co.country = 'GB'; 

我只是不知道它是應該做它,因爲我稍後需要搶調查與多個類別的最佳方式是什麼?

+0

你編輯的查詢將工作得很好。如果您有多個類別和/或國家/地區條件 –

回答

0

沒有示例數據和示例輸出,在這個查詢中幫助您非常困難。然而.....你的第二次加入將survey_countries與調查聯繫起來。我想你的意思是加入到survey_categories。另外,你有一個Group By,沒有集合函數。擺脫它,直到你有太多的信息需要總結我不是說這是正確的列

,但它是稍微「正確」比你

SELECT surveys.* 
FROM survey_countries 
LEFT JOIN surveys 
    ON survey_countries.survey_id = surveys.survey_id 
    AND survey_countries.network_id = surveys.network_id 
LEFT JOIN survey_categories 
    ON survey_categories.survey_id = surveys.survey_id 
    AND survey_categories.network_id = surveys.network_id 
WHERE survey_countries.country = 'GB' 
    AND survey_categories.category = 'my_category' 

(如果可以的話,負載在sqlfiddle中建立一個模式和樣本數據,這將使這個問題更容易解決。)

+0

感謝 - 這似乎工作,你只需要用IN代替平等的運營商。我用另一個可用的查詢更新了我的OP,與您的查詢非常相似。我只是不確定這是否是最好的方式,因爲我需要在以後的多個類別中進行調查? – Prash

+0

多個類別:你不能使用'AND survey_categories.category IN('cat','cat1','cat2')'? – AgRizzo

+0

是的 - 但我需要分開結果。我需要從每個類別獲得X個結果,所以我認爲我只需要再次運行查詢,這對理想>。<。是公平的 – Prash