postgres: отфильтровать некоторые результаты с присоединением

Я пытаюсь построить SQL-запрос (я запускаю postgres), который отфильтровывает некоторые сообщения:

Предположим, что у меня есть модель User (id, name и т. Д.), Модель Blacklist (с id, user_id, blacklisted_user_id) модель nad Post (id, author_id, название и т. Д.).

Представьте, что пользователь A (id = 5) блокирует пользователя B (id = 10).

Ни пользователь A, ни B не должны видеть свои сообщения. Я пытаюсь с запросом, который выглядит sth. как это:

SELECT posts.* FROM "posts" 
LEFT JOIN blacklists b ON (b.user_id = posts.author_id OR 
                           b.blacklisted_user_id = posts.author_id)
WHERE (b.user_id = 5 AND b.blacklisted_user_id = posts.author_id) OR
      (b.user_id = posts.author_id AND b.blacklisted_user_id = 5)

Тем не менее, результат в точности противоположный, что мне нужно: я получаю только сообщения из черного списка пользователей.

Когда я использую b.user_id! = 5 , я получаю пустой ответ.

1
nl ja de
У вас есть условие для «внешней объединенной таблицы» (черные списки) в предложении WHERE , которое эффективно превращает все это в внутреннее соединение.
добавлено автор a_horse_with_no_name, источник

1 ответы

Вы повторяете blacklisted_user_id = posts.author_id, что не нужно.

Затем вам, вероятно, нужны сообщения, которые не соответствуют черному списку. Что-то вроде:

SELECT posts.* FROM posts 
LEFT JOIN blacklists b ON (b.user_id = posts.author_id OR 
                           b.blacklisted_user_id = posts.author_id)
WHERE posts.author_id = 5 AND b.user_id IS NULL

Это то, чего вы хотели?

1
добавлено
Да, а затем вы повторяете условия в предложении WHERE. Вот где ваша проблема. Если я правильно понял, вы хотите, чтобы записи, не включенные в черный список.
добавлено автор Richard Huxton, источник
Нет, я не повторяюсь. Смотрите, что я хотел бы использовать blacklisted_user_id OR user_id (так что черный список является симметричным)
добавлено автор user1105595, источник
pgsql – PostgreSQL
pgsql – PostgreSQL
2 429 участник(ов)

Чат про PostgreSQL

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)