0

クラス用の簡単なマイクロブログ Web サイトを設計しており、スクロール ページネーションの SQL ステートメントに関するヘルプが必要です。

User と Follows の 2 つのテーブルがあります。

「ユーザー」テーブルには、uid、FirstName、LastName、Email、および Username があります。

私はrid、FollowedName、およびFollowingNameを持つ別の「フォロー」テーブルを持っています。

たとえば、ユーザー名「Alex」がユーザー名「Bob」の後に続く場合、FollowedName="Bob" および followingName="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 ステートメントを次に示します。

--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 フィドルです。

注意: 列の名前を「count」から「followercount」に変更しましCOUNTた。これは予約語です。

于 2013-12-09T22:40:37.553 に答える
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 に答える