背景
表A包含java -jar test_send_emails.jar test@gmail.com testing_subject file.txt
,userid
列。它存储了friend_id
的所有friend_id
用户。
e.g。表A
userid
表B列-----------------------
| userid | friend_id |
|---------------------|
| 3 | 5 |
| 3 | 6 |
| 3 | 7 |
| 3 | 8 |
| 3 | 9 |
-----------------------
,blocker_userid
e.g。表B
blocked_userid
问题陈述:
除了那些阻止-------------------------------------
| blocker_userid | blocked_userid |
|-----------------------------------|
| 6 | 3 |
| 9 | 3 |
-------------------------------------
的朋友外,我想从给定userid
的表A朋友列表中获取。在上述示例的情况下,查询应返回表A中userid
3的所有friend_id
,除了6和9(因为它们已阻止userid
3)
有人可以告诉您如何使用 单一SELECT查询 来完成此操作?
当前解决方案:
目前我正在解雇多个查询。一个用于获取给定userid
的所有friend_id
。然后使用每个userid
向表B查询,以查找是否已阻止friend_id
。这种方法效率不高。
更新
wewesthemenace的解决方案在这里工作完美。但是,如果我们想要不来获取"已阻止userid
的人以及被userid
&#阻止的人34; 然后这里是解决方案(由Hanno Binder回答here)
userid
答案 0 :(得分:2)
使用NOT EXISTS
:
SELECT a.*
FROM TableA a
WHERE
a.userid = @userid
AND NOT EXISTS(
SELECT 1
FROM TableB b
WHERE
b.blocked_userid = a.userid
AND b.blocker_userid = a.friend_id
)
使用LEFT JOIN
:
SELECT a.*
FROM TableA a
LEFT JOIN TableB b
ON b.blocked_userid = a.userid
AND b.blocker_userid = a.friend_id
WHERE
a.userid = @userid
AND b.blocked_userid IS NULL
答案 1 :(得分:1)
select friend_id,friend_name from tableA a
Left Join tableB b on a.friend_id=b.blocker_userid and b.blocked_userid = @userid
where a.userid = @userid and b.blocker_userid is null