2011-12-03 11 views
1

私は、これらのテーブルがあります。私は、クエリで、ユーザーのすべてのユーザーのリストを取得する必要がありは1つのクエリで3つの異なるテーブルからの3つのパラメータを取得するために、どのようにSQL

CREATE TABLE User( 
Username varchar(15) NOT NULL, 
Name varchar(20) DEFAULT '', 
Surname varchar(20) DEFAULT '', 
Email varchar(30) DEFAULT '', 
City varchar(20) DEFAULT '', 
Description varchar(1000) DEFAULT '', 
userID INTEGER NOT NULL, 
Primary key(Username, userID), 
Foreign key(userID) references Followers(userID) 
);" 

CREATE TABLE Followers( 
userID INTEGER NOT NULL, 
usernameFollower varchar(15), 
Primary key(userID), 
Foreign key(usernameFollower) references User(Username) 
);" 

CREATE TABLE Post( 
Username varchar(15) NOT NULL, 
userID INTEGER NOT NULL, 
Date DATETIME NOT NULL, 
Message VARCHAR(500) NOT NULL, 
Primary key(Username, Date), 
Foreign key(Username) references User(Username) 
);" 

を、ユーザごとに彼らが作った最新の投稿の日付と彼らが持っている信者の数。

たとえば、出力は次のようになる必要があります:私はit..Iは私が(COUNTを使用する必要が信者のカウントに推測ようにする方法を見つけ出すことはできません

USERNAME  LATEST POST     FOLLOWERS 
user1   2011/11/11 18:30:11   5 
user2   2011/10/05 17:30:00   1 
user3   2010/05/11 18:30:11   90 
user4   2011/11/11 18:30:11   5 

)が、どのように私はそれをユーザーの最新投稿にリンクできますか? 1つのクエリで可能ですか?またはビューを使用する必要がありますか?

ありがとうございます。

答えて

2

userIDを使用して3つのテーブルすべてに参加する必要があります。その後、ユーザーIDごとにグループ化して最新の投稿日付を選択することができます。もともと、私はまた、フォロワーのテーブル上に接合するが、これは意図せぬ副作用を持っているので、...のような

何か:

SELECT U.Name AS UserName, 
     MAX(P.Date) AS LatestPost, 
     (SELECT COUNT(F.userNameFollower) FROM Followers WHERE userID = U.userID) AS FollowerCount 
FROM User U 
INNER JOIN Post P ON (U.userID = P.userID) 

GROUP BY U.UserID 

が動作するはずです。

私のクエリは、ユーザーが投稿したことを前提としています。それらがいない場合は、INNER JOINをLEFT JOINに変更します。

元のクエリが機能しない理由は、各ユーザーの投稿の行と、各ユーザーのフォロワーの行と一致するため、結果の数が増えます。代わりに、サブクエリを使用して、一致するユーザーIDを持つフォロワーの数をユーザー表で選択できます。

HOWEVER ...これは、投稿のフォロワーの数ではなく、ユーザーのフォロワーの合計数をカウントします。これは、フォロワーをユーザーにのみリンクしているためです。あなたはまた、フォロワーとポストの間の関係を持つ必要があります。

これはさまざまな方法で実行できます。 PostIdとUserIdで構成されたPostFollowerテーブルを作成することができます(どのユーザが各投稿を追跡したかを見ることができます)。またはFollowIdをFollowerテーブルに追加し、FollowIdとPostIdを保存して、投稿します。

+0

うーんを行うだろう。.. – BeNdErR

+0

例:ユーザーID = 0が14post&4人のフォロワーいた場合、 userID = 1に3ポストと5フォロワーがある場合、クエリは次のように戻ります。row1: "username0 | [right latest date] | 56"; row2: "username1 | [最新の最新の日付] | 15"フォロワーにpostNumberを乗じたフォロワーの数を数えるようです。WEIRD! – BeNdErR

+0

ああ、私の間違い。元のクエリを修正してみましょう。 – dash

1

それはbelow.Pleaseのようなものは、それがポストの数の代わりに、フォロワーの数を返し、必要に応じて変更

select u.Username,max(p.Date) as latest_post,count(f.userId) as totalfollowers 
from users as u 
left join post as p on u.userId=p.userId 
left join followers as f on u.userId-f.userId 
order by p.date desc 
group by u.userId 
関連する問題