SELECT查询,其他表中指定的排除项 - 1

时间:2015-07-15 08:06:38

标签: mysql sql database

背景

表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

2 个答案:

答案 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
    )

SQL Fiddle

使用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