Mysql SQL:返回具有特定首选项设置的唯一用户
表: 前缀是首选项定义的关键,例如主语言、辅助语言等的首选项。pref values表可能有一行对应于tPrefs表中定义的每个首选项,也可能没有。有道理吗 这些值都存储在tPrefVals表中。该表中每个用户每个pref只有一行,而不是每个用户有多个pref只有一行 目标: 获取首选项20或21设置为“es”的用户列表Mysql SQL:返回具有特定首选项设置的唯一用户,mysql,sql,Mysql,Sql,表: 前缀是首选项定义的关键,例如主语言、辅助语言等的首选项。pref values表可能有一行对应于tPrefs表中定义的每个首选项,也可能没有。有道理吗 这些值都存储在tPrefVals表中。该表中每个用户每个pref只有一行,而不是每个用户有多个pref只有一行 目标: 获取首选项20或21设置为“es”的用户列表 id, userid, prefid, value 1, 1, 20, es 2, 1, 224, false 3, 1, 2
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
我的想法是左键联接pref values表两次,但使用WHERE将其限制为仅限于类型为20或21的pref。这很有效。然而,我不确定这是最好的方式来做这样的查询。。。您建议如何执行此查询?我不确定您为什么要使用tUsers表。但这应该会给你我知道你在寻找的结果:
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'))
我不知道你为什么要用tUsers表。但这应该会给你我知道你在寻找的结果:
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'))
这比您的查询更有效
select distinct userid from tPrefVals
where value = 'es' and prefid in ('20', '21')
这比您的查询更有效
select distinct userid from tPrefVals
where value = 'es' and prefid in ('20', '21')
优先级值是否存储在多个表中?前缀是什么?这和他们的母语有关吗?嗨,安东尼,见上文。希望这更有意义。那么如果前缀是他们的首选语言?为什么一个是数字系统,另一个是iso代码?是否在多个表中存储了pri_.lang.value
?前缀是什么?这和他们的母语有关吗?嗨,安东尼,见上文。希望这更有意义。那么如果前缀是他们的首选语言?为什么一个是数字系统,另一个是iso代码?谢谢,我知道它可能在某处使用了in值,但已经有一段时间了,我完全忘记了如何有效地使用它。谢谢,我知道它可能在某处使用了in值,但已经有一段时间了,我完全忘记了如何有效地使用它。