用户/订阅者sql查询

问题描述:

我正在创建一个表,显示当前用户尚未订阅的所有注册用户。但是,一旦他订阅了某人,我需要过滤该列表以排除这些列表。用户/订阅者sql查询

我们假设一张名为的表格订阅了,其中列出了用户以及他订阅的用户。

|UserId||SubscriberID| 

它很容易使之成为多个查询,但我一直在努力失败,使之成为一个查询,拯救MySQL的额外的循环调用。

这是我有什么至今:

SELECT u.UserID, FullName, UserName from users u 
    LEFT JOIN subscribed t ON 
    ((u.UserName LIKE '%$search%' OR 
     u.Email LIKE '%$search%') AND 
     ({$_SESSION['ID']} = t.UserID 
     AND t.FollowerID != u.UserID) 
    ) 

我知道查询的最后一部分是错误的,如果用户名和FollowerID不匹配一个特定行,而不是因为我只比较整个桌子。

+0

最后部分需要查询的WHERE子句中,所以它会在每一行中工作,而比加入整个桌子... – 2010-01-22 02:55:29

+0

似乎没有改变任何东西。你能详细说明吗? – 2010-01-22 03:05:35

要查找表A中不在表B中的结果列表,您有两个选项。使用NOT IN语法或LEFT JOIN并查看B表中PK字段的位置是NULL

NOT IN例如:

SELECT a.id FROM a WHERE a.id NOT IN (SELECT b.id FROM b)

LEFT JOIN例如:

SELECT a.id FROM a LEFT JOIN b ON (a.id = b.id) WHERE (b.id IS NULL)

+1

我应该提到,在子查询中使用'NOT IN'将需要MySQL 5.0或更高版本,并且会比'LEFT JOIN'想法慢。我个人更喜欢'NOT IN'语法的语义,尽管它没有性能,只要它不会显着影响你的应用程序的响应时间。 – 2010-01-22 03:10:06

+1

MySQL 4.1也支持子查询。 – 2010-01-22 03:23:36

+0

哦,谢谢比尔,现在你提到它就听起来很熟悉。 – 2010-01-22 03:36:33