2012-05-23 59 views
0

表:SQL:返回唯一的用戶具有特定偏好設置

 
tUsers: userid     (contains user info) 
tPrefs: prefid, prefname (contains preference definitions) 
tPrefVals: userid, prefid, value (contains preference values) 

首選項不是必需的,所以喜好紀錄實際上可能不存在。

的首選項表看起來像:

id, userid, prefid, value 
1, 1,  20,  es 
2, 1,  224, false 
3, 1,  234, true 
4, 2,  220, en 
5, 2,  221, es 
6, 2,  234, true 

的prefid是關鍵的偏好定義,比方說爲主要語言,仲語言等的偏好的PREF值表可以或可以不具有一個排對應於tPrefs表中定義的每個首選項。合理?

這些值都存儲在tPrefVals表中。只是每個用戶的每個用戶有一行,而不是每個用戶有一個行有多個首選項。

目標: 獲取哪些用戶的首選項20或21設置爲'es'值。

SELECT DISTINCT tUsers.userid FROM tUsers 
LEFT JOIN tPrefVals AS pri_lang ON tUsers.userid = pri_lang.user_id 
LEFT JOIN tPrefVals AS sec_lang ON tUsers.userid = sec_lang.user_id 
WHERE 
((pri_lang.prefid = '20' AND pri_lang.value = 'es') 
OR 
(sec_lang.prefid = '21' AND sec_lang.value = 'es')) 

我的想法是左連接pref值表兩次,但使用WHERE將其限制爲只有類型20或21的首選項。但是,我不確定這是做這樣一個查詢的最佳方式......你如何建議做這個查詢?

+0

是否將pri_lang.value存儲在多個表中? – Anthony

+0

什麼是'prefid'?它與他們的主要語言有關嗎? – Anthony

+0

嗨安東尼,見上文。希望這更有意義。 – key2starz

回答

3

這比你的查詢效率高得多。

SELECT distinct a.UserID 
FROM tUsers a LEFT JOIN tPrefVals b 
     on a.UserID = b.UserID 
WHERE b.PrefID in ('20', '21') AND b.`Value` = 'es' 
+0

謝謝,我知道它可能在某個地方使用某個值,但它已經有一段時間了,並且完全忘記了如何有效地做到這一點。 – key2starz

0

我不確定你爲什麼使用tUsers表。但是這應該會給你我想要的結果:

select distinct userid from tPrefVals 
where value = 'es' and prefid in ('20', '21')