用户/订阅者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不匹配一个特定行,而不是因为我只比较整个桌子。
要查找表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)
我应该提到,在子查询中使用'NOT IN'将需要MySQL 5.0或更高版本,并且会比'LEFT JOIN'想法慢。我个人更喜欢'NOT IN'语法的语义,尽管它没有性能,只要它不会显着影响你的应用程序的响应时间。 – 2010-01-22 03:10:06
MySQL 4.1也支持子查询。 – 2010-01-22 03:23:36
哦,谢谢比尔,现在你提到它就听起来很熟悉。 – 2010-01-22 03:36:33
最后部分需要查询的WHERE子句中,所以它会在每一行中工作,而比加入整个桌子... – 2010-01-22 02:55:29
似乎没有改变任何东西。你能详细说明吗? – 2010-01-22 03:05:35