繁体   English   中英

如何在一个查询中从3个不同的表中获取3个参数 - SQL

[英]How to get 3 parameters from 3 different tables in one query - 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) 
);"

我需要查询一个包含User中所有用户的列表,并为每个用户提供他们发布的最新帖子的日期以及他们拥有的关注者数量。

例如,输出必须是这样的:

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

我不知道如何制作。.我想使用COUNT()需要关注的人数,但是如何将其链接到用户的最新帖子? 只有一个查询可以吗? 还是我需要使用视图?

在此先感谢,最好的问候。

您需要通过userID连接所有3个表。 然后,您可以按用户ID分组来选择最新的发布日期。 最初,我也加入了Followers表,但这有意想不到的副作用,所以...

就像是:

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。

原始查询不起作用的原因是它匹配每个用户的Post中的行,以及每个用户的追随者中的行 - 从而将结果的数量相乘。 相反,我们可以使用子查询在User表中选择具有匹配用户ID的关注者数量。

但是 ......这只计算用户拥有的关注者总数,而不是帖子关注者的数量。 原因是因为您只将关注者链接到用户。 你还需要在追随者和帖子之间建立关系。

你可以通过多种方式做到这一点; 您可以创建一个由PostId和UserId组成的PostFollower表(这样您就可以看到哪个用户关注了每个帖子),也可以将PostId添加到Follower表中,并存储关注者userId和PostId,从而可以存储哪个用户关注了哪个帖子。

如下图所示。请进行必要的更改

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM