Как получить 3 параметра из 3 разных таблиц в одном запросе - SQL - PullRequest
1 голос
/ 04 декабря 2011

У меня есть эти таблицы:

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 (), но как я могу связать его с последним сообщением пользователя? Возможно только в одном запросе? Или мне нужно использовать представления?

Заранее спасибо, с наилучшими пожеланиями.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Вам необходимо объединить все 3 таблицы через идентификатор пользователя.Затем вы можете выбрать самую последнюю дату публикации, группируя по идентификатору пользователя.Первоначально я также присоединился к таблице последователей, но это имеет непреднамеренный побочный эффект, поэтому ...

Что-то вроде:

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 для каждого пользователя и строке в Followers для каждого пользователя.- таким образом, умножая количество результатов.Вместо этого мы можем использовать подзапрос, чтобы выбрать количество подписчиков с совпадающим идентификатором пользователя в таблице User.

HOWEVER ... это только подсчитывает общее число подписчиков, которое имеет пользователь,не количество подписчиков на пост.Причина этого в том, что вы только связали подписчика с пользователем.Вы также должны иметь отношения между Фолловером и Постом.

Вы можете сделать это несколькими способами;Вы можете создать таблицу PostFollower, состоящую из PostId и UserId (чтобы вы могли видеть, какой пользователь следил за каждым сообщением), или вы можете добавить PostId в таблицу Follower и сохранить userId подписчика и PostId, что позволит вам сохранить, за каким пользователемкакие сообщения.

1 голос
/ 04 декабря 2011

Это будет что-то вроде ниже. Пожалуйста, сделайте необходимые изменения

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...