Есть ли способ реализовать счет в левом соединении - PullRequest
2 голосов
/ 14 апреля 2019

Я настраиваю приложение Chat-Group, используя простую базу данных. Я хочу знать, есть ли способ увидеть людей, которым понравился / не понравился определенный пост, к которому можно прикрепить картинку или видео. Важная информация, которую я хочу знать, - это идентификатор сообщения, сообщение, дата публикации, URL-адрес изображения, которое я хочу опубликовать, URL-адрес видео и идентификатор пользователя, отправляющего указанное сообщение. Я использую левые соединения, чтобы увидеть всю эту информацию, но мне не хватает, если сообщения имеют симпатии или антипатии.

Я уже пытался использовать совокупный счетчик, чтобы увидеть каждую понравившуюся и не понравившуюся запись, но я не знаю, как смешать этот запрос с предыдущей информацией.

Это мой запрос, чтобы увидеть информацию, указанную выше:

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 ]

1 голос
/ 14 апреля 2019

Мне не нравится идея дважды зайти за стол reactions.Один из способов избежать этого - использовать боковое соединение:

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
1 голос
/ 14 апреля 2019

Один из способов сделать это - использовать коррелированный подзапрос.

SELECT p.post_id,
       p.post_msg,
       p.post_date,
       f.photo_url,
       v.video_url,
       p.user_id,
       (SELECT count(*)
               FROM reaction r
               WHERE r.post_id = p.post_id
                     AND r.reaction_like) likes,
       (SELECT count(*)
               FROM reaction r
               WHERE r.post_id = p.post_id
                     AND r.reaction_dislike) 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
       WHERE p.chat_id = 1;

Однако мне интересно, может ли реакция быть одновременно похожей и неприязненной.По крайней мере, ваша модель данных допускает такую ​​вещь ...

...