有没有一种方法可以在左连接中实现计数

时间:2019-04-13 23:20:04

标签: sql database postgresql pgadmin

我正在使用一个简单的数据库设置一个聊天组应用程序。我想知道是否有办法让我看到喜欢/不喜欢某个帖子的人,这些帖子可以带有图片或视频。我想知道的重要信息是帖子ID,帖子消息,帖子日期,我要发布的图片的url,视频的url和发布该帖子的用户的id。我正在使用左联接来查看所有这些信息,但是如果帖子有喜欢或不喜欢,我会丢失。

我已经尝试使用汇总计数来查看帖子的喜欢和不喜欢,但是我不知道如何将该查询与以前的信息混合使用。

这是我的查询,以查看上面列出的信息:

select P.post_ID, P.post_msg, P.post_date, F.photo_url,V.video_url, P.user_ID
from ((Post as P left join Photo as F on P.post_ID = F.post_ID ) left join Video as V 
on P.post_ID = V.post_ID)
where P.chat_ID = 1

这是查询的输出:

Here is the output of the Query

这是我想要的输出示例:

Here is an example of the output I want

上面的查询显示了我正在寻找的所有内容,除了每个帖子的喜欢和不喜欢。反正有没有看到这些信息和我想要的东西?

这是数据库的结构:

create table Login(login_ID serial primary key, login_Date DATE NOT NULL DEFAULT CURRENT_DATE, user_name varchar(20) NOT NULL);

create table Users(user_ID serial primary key, user_name varchar(20) NOT NULL, user_password varchar(20) NOT NULL);

create table Contact_List(contactlist_ID serial primary key, user_name varchar(20) NOT NULL,user_ID integer references Users(user_ID) on delete cascade);

create table Person(person_ID serial primary key, person_name varchar(20) NOT NULL, person_lastname varchar(30) NOT NULL, person_phone varchar(12), person_email varchar(50) NOT NULL, user_ID INTEGER references Users(user_ID) on delete cascade);

create table Admin(admin_ID serial primary key, user_ID INTEGER references Users(user_ID) on delete cascade);

create table Chat_Group(chat_ID serial primary key, chat_name varchar(50) NOT NULL, admin_Id INTEGER references Admin(admin_ID) on delete cascade);

create table Group_List(user_ID INTEGER references Users(user_ID) on delete cascade, chat_ID integer references Chatgroup(chat_id) on delete cascade, primary key(user_id, chat_id));

create table Post(post_ID serial primary key, post_msg varchar(280), post_date DATE NOT NULL DEFAULT CURRENT_DATE, user_ID INTEGER references Users(user_ID) on delete cascade, chat_ID INTEGER references Chatgroup(chat_ID) on delete cascade);

create table Video(video_ID serial primary key, video_url varchar(280) NOT NULL, post_ID INTEGER references Post(post_ID) on delete cascade);

create table Photo(photo_ID serial primary key, photo_url varchar(280) NOT NULL, post_ID INTEGER references Post(post_ID) on delete cascade);

create table Reply(reply_ID serial primary key, reply_msg varchar(280) NOT NULL, reply_Date DATE NOT NULL DEFAULT CURRENT_DATE, post_ID INTEGER references Post(post_ID) on delete cascade, user_ID INTEGER references Users(user_ID) on delete cascade);

create table HashTag(hashtag_ID serial primary key, hashtag_msg varchar(200) NOT NULL,post_ID INTEGER references Post(post_ID) on delete cascade NOT NULL, user_ID INTEGER references Users(user_ID) on delete cascade);

create table Reaction(reaction_ID serial primary key,reaction_date DATE NOT NULL DEFAULT CURRENT_DATE, reaction_like BOOLEAN, reaction_dislike BOOLEAN, post_ID INTEGER references Post(post_ID) on delete cascade, user_ID INTEGER references users(user_ID) on delete cascade);

create table React_to(reaction_ID INTEGER references Reaction(reaction_ID) on delete cascade, reply_ID INTEGER references Reply(reply_ID) on delete cascade, primary key(reaction_ID,reply_ID));

不好意思,英语不是我的主要语言。

2 个答案:

答案 0 :(得分:1)

一种方法是使用相关子查询。

this.state = {
            symbol: []
        }

但是,我想知道一次反应既可以是喜也可以是不喜。至少您的数据模型允许这样的事情...

答案 1 :(得分:1)

我不喜欢两次进入reactions s表的想法。避免这种情况的一种方法是使用横向联接:

select P.post_ID, P.post_msg, P.post_date, F.photo_url, V.video_url, P.user_ID,
       r.num_likes, r.num_dislikes
from Post P left join
     Photo F
     on P.post_ID = F.post_ID left join
     Video V 
     on P.post_ID = V.post_ID left join lateral
     (select sum(r.reaction_like) as num_likes,
             sum(r.reaction_dislike) as num_dislikes
      from reactions r
      where r.post_id = p.post_id
     ) r
     on 1=1
where P.chat_ID = 1