0

我正在为一个班级设计一个简单的微博网站,需要一些关于滚动分页的 sql 语句的帮助。

我有 2 个表:用户和关注。

在我的“用户”表中,我有 uid、FirstName、LastName、Email 和 Username。

我有另一个“Follows”表,其中包含了 rid、FollowedName 和 FollowName。

例如,如果用户名“Alex”跟随用户名“Bob”,那么将存在一个新行,其中 FollowedName="Bob" 和 FollowName="Alex"。

对于搜索页面,我允许用户根据受欢迎程度(基于关注者的数量)进行排序。所以我需要一个 SQL 语句,它将从“用户”中选择所有行,然后根据每个用户在“关注”表中的条目数对它们进行排序。

最重要的是,我需要该语句来过滤掉那些 uid 在字符串名称 $explodedids 中的用户。

我一切正常,但我不知道该把"WHERE uid NOT IN (".$explodedids.")".

这是我的声明,它正确返回但没有过滤掉 $explodedids:

"SELECT Username, FirstName, LastName, Email, COUNT( Followingname ) AS count 
 FROM (SELECT u.Username, u.FirstName, u.LastName, u.Email, f.Followingname 
       FROM User AS u LEFT JOIN Follows AS f ON u.Username = f.Followingname) 
 AS T GROUP BY Username ORDER BY count DESC LIMIT ".$postnumbers

$postnumbers 只是我滚动分页的限制数。我确信我只是把 WHERE NOT IN 放在了错误的地方,但如果你们能帮助我,那就太棒了。

4

2 回答 2

1
"SELECT Username, FirstName, LastName, Email, 
 COUNT( Followingname ) AS count 
 FROM (
 SELECT u.Username, u.FirstName, u.LastName, u.Email, f.Followingname 
       FROM User AS u 
       LEFT JOIN Follows AS f 
       ON u.Username = f.Followingname 
       WHERE u.id NOT IN($explodids)
 ) AS T 
 GROUP BY Username 
 ORDER BY count DESC 
 LIMIT $postnumbers";

假设 $explodids 是格式为 'x,y,z' 的字符串

于 2013-12-09T22:30:36.203 回答
1

这是一个满足您要求的选择语句:

--Test Data
CREATE TABLE #User (  uid int
                   , FirstName varchar(50)
                   , LastName varchar(50)
                   , Email varchar(50)
                   , Username  varchar(50));

INSERT INTO #User(uid, FirstName, LastName, Email, Username) VALUES(1,'MackF','MackL','mack@mack.com','MackUname');
INSERT INTO #User(uid, FirstName, LastName, Email, Username) VALUES(2,'2F','2L','2@mack.com','2Uname');
INSERT INTO #User(uid, FirstName, LastName, Email, Username) VALUES(3,'3F','3L','3@mack.com','3Uname');
INSERT INTO #User(uid, FirstName, LastName, Email, Username) VALUES(4,'4F','4L','4@mack.com','4Uname');

CREATE TABLE #Follows( rid int
                    , FollowedName varchar(50)
                    , FollowingName varchar(50));

INSERT INTO #Follows VALUES(1,'4Uname','2Uname');
INSERT INTO #Follows VALUES(2,'MackUname','4Uname');
INSERT INTO #Follows VALUES(3,'4Uname','3Uname');
INSERT INTO #Follows VALUES(4,'MackUname','3Uname');

--Query
SELECT u.Username
     , u.FirstName
     , u.LastName
     , u.Email
     , COUNT( f.Followingname ) AS followercount 
FROM #User u 
LEFT JOIN #Follows f 
   ON u.Username = f.Followingname
WHERE uid NOT IN (2,4)--here is where your WHERE clause goes remove this line to see all records
GROUP BY u.Username
ORDER BY followercount DESC

--Results
USERNAME    FIRSTNAME   LASTNAME    EMAIL           FOLLOWERCOUNT
3Uname      3F          3L          3@mack.com      2
MackUname   MackF       MackL       mack@mack.com   0

这是一个SQL fiddle来尝试一下。

注意:我已将您的列“count”重命名为“followercount”作为COUNT保留字。

于 2013-12-09T22:40:37.553 回答