Запрос PostgreSQL в двух таблицах с CASE

У меня есть две таблицы publications и publication_likes, где у меня есть отношения "многие ко многим", и это поля: user_id, pub_id, created_at.

У пользователей есть профиль, и в нем есть публикации. Мне нужно получать публикации конкретного пользователя, когда запрашивается его профиль (это легко). Также мне нужно знать, какие из этих публикаций лайкает пользователь, вошедший в систему.

Пример: user_a является владельцем профиля и имеет публикации, user_b вошел в систему и посещает профиль user_a. Сервер загружает публикации user_a и сообщает user_b, какие из этих публикаций user_a понравились.

Прежде чем спросить, я попытался подумать и нашел решение, но не знаю, правильно ли оно

 SELECT p.id, 
      p.user_id as creator, 
      p.p_content, 
      CASE WHEN pl.user_id = $1 THEN 1 
           ELSE 0 
       END as liked from publications p
  LEFT JOIN publications_likes pl on p.id = pl.pub_id 
  WHERE p.user_id = $2;

Скажите, пожалуйста, считаете ли вы это правильным или нет, и есть ли другой способ сделать то же самое.

ПРИМЕЧАНИЕ: я знаю, что название не совсем конкретное, но я не мог придумать другого. Если вы можете сделать это лучше, не стесняйтесь делать это.

Меня смущает which of that publications the user who is logged in likes.. Вы имеете в виду, что user_a вошел в систему и просматривает профиль user_b, и вам нужно получить все публикации, которые понравились user_b, чтобы показать user_a, или публикации user_b, которые понравились user_a.

Haleemur Ali 16.07.2018 05:02

да, у меня есть user_a, у которого есть несколько публикаций, и user_b, которому, возможно, понравились публикации user_a и который вошел в систему. Мне нужно получить публикации user_a и в то же время узнать, какие из этих публикаций нравятся user_b. :-)

Ángel Barrios 16.07.2018 06:40

ваш оператор дает вам правильный результат, хотя вы можете упростить оператор case как этот ответ предполагает. просто убедитесь, что $1 = user who is viewing profile and liked publications & $2 = user who created publication

Haleemur Ali 16.07.2018 07:08

Ага, я уже упростил. Считаете ли вы, что это хороший и оптимизированный способ сделать это? у вас есть какие-нибудь рекомендации? :-)

Ángel Barrios 16.07.2018 07:41

да, это хороший способ написать этот запрос. ИМО, предложенный ответ должен быть принят

Haleemur Ali 16.07.2018 15:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: обновлено, чтобы отразить разъяснения в комментариях.

Вы можете получить правильный набор результатов без использования оператора CASE.

 SELECT p.id, 
       p.user_id as creator, 
       p.p_content, 
       pl.id IS NOT NULL AS liked 
   FROM publications p
   LEFT JOIN publications_likes pl ON p.id = pl.pub_id AND pl.user_id = $1
   WHERE p.user_id = $2;

Вам нужно будет использовать два условия для соединения, чтобы убедиться, что вы нашли правильную строку pl, поскольку вы присоединяетесь к таблице соединений для отношения M: N. В противном случае вы действительно не знаете, к какому pl вы действительно присоединитесь, и вы можете получить ложноотрицательные результаты для liked.

Спасибо, пользователь, которому нравятся публикации, не является владельцем профиля. Имею владельца профиля: user_a. Есть user_b, которому нравятся публикации user_a. Мне нужно получить публикации user_a, а затем или одновременно узнать, какие из этих публикаций user_a нравятся user_b.

Ángel Barrios 16.07.2018 06:53

Спасибо за разъяснение, отредактировал свой ответ, чтобы отразить это.

ajxs 16.07.2018 08:20

Другие вопросы по теме