说我有两张桌子
User
-----
id
first_name
last_name
User_Prefs
-----
user_id
pref
User_Prefs中的示例数据可能是
user_id | pref
2 | SMS_NOTIFICATION
2 | EMAIL_OPT_OUT
2 | PINK_BACKGROUND_ON_FRIDAYS
某些用户可能在User_Pref中没有相应的行。
我需要查询任何没有EMAIL_OPT_OUT的用户的名字和姓氏作为他们的(可能很多,可能没有)User_Pref行之一。
SELECT DISTINCT u.* from User u
LEFT JOIN User_Prefs up ON (u.id=up.user_id)
WHERE up.pref<>'EMAIL_OPT_OUT'
让每个至少有一行不是“EMAIL_OPT_OUT”的人,这当然不是我想要的。我希望每个人都没有符合“EMAIL_OPT_OUT”的行。
有没有办法让连接类型和连接条件过滤掉我想留在这里的行?或者我需要一个子查询?
答案 0 :(得分:11)
我个人认为“where not exists”类型的子句可能更容易阅读,但这是一个带有连接的查询,它可以做同样的事情。
select distinct u.* from User u
left join User_Prefs up ON u.id = up.user_id and up.pref = 'EMAIL_OPT_OUT'
where up.user_id is null
答案 1 :(得分:0)
为什么不将用户首选项存储在用户表中作为布尔字段?这将显着简化您的查询。
SELECT * FROM User WHERE EMAIL_OPT_OUT = false