如果有人可以帮助我完成下面的查询,那就太好了!这个查询非常具有挑战性,我尝试自己这样做,但无法显示正确的结果......
我使用类似于“Facebook”的系统的数据库。
查询应显示在过去一年中为每个帖子撰写评论的用户的电子邮件和姓名,这些帖子由他们的每个朋友发布。
意思是,我只想显示对所有朋友的所有帖子发表评论的人。
这是我的试验,但我收到了部分结果。我无法理解我做错了什么。
select distinct U.Mail, U.FirstName + ' ' + U.LastName as FullName
from Users U
inner join FriendsList FL on U.Mail = FL.Mail1
inner join Post P on FL.Mail2 = P.UserMail
left outer join Comment C on P.ID = C.IDPost and P.UserMail <> C.Mail
where datediff(year, P.DatePosted, getdate()) <= 1
group by U.Mail, U.FirstName, U.LastName
having count(distinct P.ID) = count(distinct C.IDPost)
链接到 BAK 文件(包括测试数据): https ://file.io/SagvM3cx
例子:
假设我和亚当和本是朋友。
⭐️ 第一种情况:
- 亚当写了 1 篇文章,我发表了评论。
- Ben 写了 1 篇文章,我没有发表评论。
然后,我的名字不应该显示在查询中。?
- 亚当写了 1 篇文章,我发表了评论。
- Ben 写了 1 个帖子,我发表了评论。
然后,我的名字应该显示在查询中。?
⭐️第二种情况:
- 亚当写了 2 个帖子,我评论了第一个,但没有评论第二个。
- Ben 写了 1 个帖子,我发表了评论。
然后,我的名字不应该显示在查询中。?
- 亚当写了 2 篇文章,我都发表了评论。
- Ben 写了 1 个帖子,我发表了评论。
然后,我的名字应该显示在查询中。?
⭐️ 第三种情况:
- 亚当写了 2 篇文章,我都发表了评论。
- Ben 写了 1 个帖子,我发表了评论。
- 马克(不是我的朋友)写了 1 篇文章,我没有发表评论。
然后,我的名字应该显示在查询中。?
编辑:我添加了 8 个查询 - 4create table
和 4 insert
。根据这个例子,上面的查询应该只显示Kelly
create table Users
(
Mail nvarchar (20) primary key check(Mail like '_%@_%._%' and (Mail like '%[0-9]%' Or Mail like '%[a-z]%'Or Mail like '%[A-Z]%')),
Password nvarchar (8) check (Password like '%[0-9]%' and Password like '%[az]%' and len(password) <= 8) not null,
FirstName nvarchar (20) not null,
LastName nvarchar (20) not null,
BirthDate date check (datediff(year,BirthDate,getdate())>=18) not null,
JoinDate date check (JoinDate<=getdate()) not null,
Gender nchar(1) check(Gender = 'F' or Gender = 'M' or Gender = 'O'),
NickName nvarchar(20),
Photo nvarchar(20),
Phone bigint check (Phone like '%[0-9]%' and len(Phone) <= 10) not null
)
INSERT INTO Users
VALUES
('[email protected]','k1000000','Kelly','Ka','1992-05-15','2016-09-04','F','Kelly','Kelly.jpg','546296100'),
('[email protected]','l1101111','Lilly','La','1999-04-03','2012-04-04','F','Lilly','Lilly.jpg','542448300'),
('[email protected]','m120121','Moshe','Ma','1995-06-03','2011-04-02','M','Moshe','MosheMa.jpg','542840111'),
('[email protected]','n130131','Nelly','Na','1994-03-07','2020-04-13','F','Nelly','NellyNa.jpg','541234567');
('[email protected]','o140141','Owen','Oa','1992-02-02','2020-05-13','M','Owen','OwenOa.jpg','541234567');
create table FriendsList
(
Mail1 nvarchar (20) references Users(Mail) not null,
Mail2 nvarchar (20) references Users(Mail) not null,
DateAdding date check (DateAdding<=getDate()) not null,
primary key (Mail1,Mail2)
)
INSERT INTO FriendsList
VALUES
('[email protected]','[email protected]','2018-04-18'),
('[email protected]','[email protected]','2020-04-22'),
('[email protected]','[email protected]','2020-04-22'),
('[email protected]','[email protected]','2020-04-22'),
('[email protected]','[email protected]','2018-04-18');
('[email protected]','[email protected]','2020-04-22'),
create table Post
(
ID int identity(1,1) primary key,
Photo nvarchar(20),
Text nvarchar(200),
Location nvarchar(50),
Video int,
DatePosted date check (datediff(month,DatePosted,getdate())<=3) not null,
UserMail nvarchar (20) references Users(Mail) on delete cascade on update
cascade not null
)
INSERT INTO Post
VALUES
('','my name is nellu','','','2020-04-18','[email protected]'),
('','hii','','','2020-05-19','[email protected]');
create table Comment
(
IDPost int references Post(ID) on delete cascade on update cascade not null,
SerialNumComment int check(SerialNumComment > 0) not null,
DateAndTimeComment Datetime check (DateAndTimeComment<=getDate()) not null,
Text nvarchar(200) not null,
Mail nvarchar (20) references Users(Mail) not null,
primary key (IDPost,SerialNumComment)
)
INSERT INTO Comment
VALUES
('1','1','2020-04-18','blabla','[email protected]'),
('2','1','2020-05-05','bhfk','[email protected]');
您原始查询中的问题是
应该
您正在尝试获取原始用户发布的评论
就我个人而言,我发现双重
NOT EXISTS
方法更容易遵循(尽管如何对待没有符合条件的帖子进行评论的用户的语义不同)。您正在寻找没有来自他们的一位朋友最近发布且没有来自该用户的评论的用户。
这实现了该逻辑