使用SQL查询按帖子计数喜欢

时间:2020-04-16 14:09:48

标签: sql sql-server tsql

能否请您帮助我构建sql查询以获取特定帖子的所有信息,并且我需要对所有帖子进行相同操作 而我需要的第二个选项是,如果当前登录的用户已经喜欢该特定帖子,则我需要具有一个true或false布尔值。

我想同时加入表格并获得特定帖子的喜欢总数,以及当前用户是否喜欢该帖子

帖子点赞表

    Id                                  PostId                                  LikedBy        LikedOn
9B0B2DEB-47CE-4F6E-B892-35D2F2D3F543    480149F2-BCF4-40F4-3C19-08D7DFC7C616    0F8FAD5B-D9CB-469F-A165-70867728950E    2020-04-15 23:08:26.567
40E7C5F4-AD42-4A22-8BC0-5B0C9F125427    480149F2-BCF4-40F4-3C19-08D7DFC7C616    0F8FAD5B-D9CB-469F-A165-70867728950E    2020-04-15 23:08:10.530
C132E64E-C9A2-471E-9DD9-CB9A342D2DBE    6B989E93-10FE-4131-38B4-08D7DC6856B4    0F8FAD5B-D9CB-469F-A165-70867728950E    2020-04-16 11:43:46.730
32099959-DB24-42F0-A629-F0991163509A    480149F2-BCF4-40F4-3C19-08D7DFC7C616    0F8FAD5B-D9CB-469F-A165-70867728950E    2020-04-15 22:49:44.557
AA606CFF-EAC0-4010-A673-FF682D46AB80    480149F2-BCF4-40F4-3C19-08D7DFC7C616    0F8FAD5B-D9CB-469F-A165-70867728950E    2020-04-16 11:43:54.587

所有帖子

Id                                      Title                    UserId                          Post
6B989E93-10FE-4131-38B4-08D7DC6856B4    great                   0F8FAD5B-D9CB-469F-A165-70867728950E    this is great app to build
480149F2-BCF4-40F4-3C19-08D7DFC7C616    What is Lorem Ipsum?    0F8FAD5B-D9CB-469F-A165-70867728950E    Lorem Ipsum is simply dummy 

此处post.userid = postlike.likedby 和post.id = postlike.postid

我尝试了这个,但是查询继续执行,没有任何输出

    DROP TABLE IF EXISTS #Tempposts
create table #Tempposts
(
    PostID varchar(50), 
    UserID varchar(50),
    TotalLikes int,
    IsLikedByUser bit
)
Declare @TempPostID varchar(50)
Declare @TempUserID varchar(50)
Declare @TempTotalLikes Int
Declare @TempIsLikedByUser bit
Declare @Id uniqueidentifier
Declare @UserId uniqueidentifier

DECLARE load_cursor CURSOR FOR 
    SELECT Id, UserId
    FROM tbl_posts

OPEN load_cursor 
FETCH NEXT FROM load_cursor INTO @Id, @UserId
WHILE @@FETCH_STATUS = 0 
    BEGIN 
        SET @TempPostID = @Id
        SET @TempUserID = @UserId
        SET @TempTotalLikes = (select count(*) from tbl_postlikes where PostId = @Id)
        SET @TempIsLikedByUser = (select count(*) from tbl_postlikes where PostId = @Id and LikedBy = @UserId)
        insert into #Tempposts values(@TempPostID, @TempUserID, @TempTotalLikes, @TempIsLikedByUser)
        FETCH NEXT FROM load_cursor INTO @Id, @UserId
    End
Close load_cursor
DeAllocate load_cursor
select * from #Tempposts
Drop table #Tempposts

我的表定义

CREATE TABLE [dbo].[tbl_postlikes](
    [Id] [uniqueidentifier] NOT NULL,
    [PostId] [uniqueidentifier] NULL,
    [LikedBy] [uniqueidentifier] NULL,
    [LikedOn] [datetime] NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tbl_posts](
    [Id] [uniqueidentifier] NULL,
    [Title] [varchar](max) NULL,
    [Post] [varchar](max) NULL,
    [UserId] [uniqueidentifier] NULL,
    [Created] [datetime] NULL,
    [Updated] [datetime] NULL,
    [IsVisible] [bit] NULL,
    [CreatedBy] [uniqueidentifier] NULL,
    [UpdatedBy] [uniqueidentifier] NULL,
    [HasComments] [bit] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

1 个答案:

答案 0 :(得分:1)

查询似乎正常,如果您有问题,我希望此代码中没有。但是我不知道为什么要使用游标。您需要的是

SELECT 
Id, 
UserId,
(select count(*) from tbl_postlikes where PostId = tbl_posts.Id) as TotalLikes,
(select count(*) from tbl_postlikes where PostId = tbl_posts.Id and LikedBy = @currentUser) as IsLikedByUser
FROM tbl_posts

您的代码似乎在IsLikedByUser中有错误。您测试的是,该帖子的作者喜欢他的帖子,可能不是您想要的。您应该将当前用户作为查询的参数发送给该用户并进行测试。

您绝对应该添加代码来填充表格。我的意思是:

insert into tbl_posts (id, title, userid, post)
values
('6B989E93-10FE-4131-38B4-08D7DC6856B4', 'great',                '0F8FAD5B-D9CB-469F-A165-70867728950E', 'this is great app to build'),
('480149F2-BCF4-40F4-3C19-08D7DFC7C616', 'What is Lorem Ipsum?', '0F8FAD5B-D9CB-469F-A165-70867728950E', 'Lorem Ipsum is simply dummy');

insert into tbl_postlikes (Id, PostId, LikedBy, LikedOn)
values
('9B0B2DEB-47CE-4F6E-B892-35D2F2D3F543', '480149F2-BCF4-40F4-3C19-08D7DFC7C616', '0F8FAD5B-D9CB-469F-A165-70867728950E', '2020-04-15 23:08:26.567'),
('40E7C5F4-AD42-4A22-8BC0-5B0C9F125427', '480149F2-BCF4-40F4-3C19-08D7DFC7C616', '0F8FAD5B-D9CB-469F-A165-70867728950E', '2020-04-15 23:08:10.530'),
('C132E64E-C9A2-471E-9DD9-CB9A342D2DBE', '6B989E93-10FE-4131-38B4-08D7DC6856B4', '0F8FAD5B-D9CB-469F-A165-70867728950E', '2020-04-16 11:43:46.730'),
('32099959-DB24-42F0-A629-F0991163509A', '480149F2-BCF4-40F4-3C19-08D7DFC7C616', '0F8FAD5B-D9CB-469F-A165-70867728950E', '2020-04-15 22:49:44.557'),
('AA606CFF-EAC0-4010-A673-FF682D46AB80', '480149F2-BCF4-40F4-3C19-08D7DFC7C616', '0F8FAD5B-D9CB-469F-A165-70867728950E', '2020-04-16 11:43:54.587');