0

表:

tUsers:用户标识(包含用户信息)
tPrefs:prefid,prefname(包含首选项定义)
tPrefVals:userid、prefid、value(包含偏好值)

首选项不是必需的,因此可能实际上不存在首选项记录。

首选项表如下所示:

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 是首选项定义的关键,例如对主要语言、次要语言等的首选项。首选项值表可能有也可能没有对应于 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'))

我的想法是两次左加入首选项值表,但使用 WHERE 将其限制为仅类型 20 或 21 的首选项。这有效。但是,我不确定这是进行此类查询的最佳方式...您建议如何进行此查询?

4

2 回答 2

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'
于 2012-05-23T04:57:58.007 回答
0

我不确定您为什么使用 tUsers 表。但这应该会给你我理解你正在寻找的结果:

select distinct userid from tPrefVals
where value = 'es' and prefid in ('20', '21')
于 2012-05-23T04:55:32.820 回答