У меня есть две таблицы 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;
Скажите, пожалуйста, считаете ли вы это правильным или нет, и есть ли другой способ сделать то же самое.
ПРИМЕЧАНИЕ: я знаю, что название не совсем конкретное, но я не мог придумать другого. Если вы можете сделать это лучше, не стесняйтесь делать это.
да, у меня есть user_a, у которого есть несколько публикаций, и user_b, которому, возможно, понравились публикации user_a и который вошел в систему. Мне нужно получить публикации user_a и в то же время узнать, какие из этих публикаций нравятся user_b. :-)
ваш оператор дает вам правильный результат, хотя вы можете упростить оператор case как этот ответ предполагает. просто убедитесь, что $1 = user who is viewing profile and liked publications & $2 = user who created publication
Ага, я уже упростил. Считаете ли вы, что это хороший и оптимизированный способ сделать это? у вас есть какие-нибудь рекомендации? :-)
да, это хороший способ написать этот запрос. ИМО, предложенный ответ должен быть принят


Обновлено: обновлено, чтобы отразить разъяснения в комментариях.
Вы можете получить правильный набор результатов без использования оператора 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.
Спасибо за разъяснение, отредактировал свой ответ, чтобы отразить это.
Меня смущает
which of that publications the user who is logged in likes.. Вы имеете в виду, чтоuser_aвошел в систему и просматривает профильuser_b, и вам нужно получить все публикации, которые понравилисьuser_b, чтобы показатьuser_a, или публикацииuser_b, которые понравилисьuser_a.