Сложность определения синтаксиса для запроса PostgreSQL для захвата временной шкалы сообщений

#sql #postgresql #knex.js

#sql #postgresql #knex.js

Вопрос:

Я новичок в PG, и у меня возникли проблемы с правильным синтаксисом этого запроса. Я продолжаю получать ERROR: missing FROM-clause entry for table "post_reactions" . Я уверен, что это глупый недосмотр.

Я пытаюсь создать ваш типичный список сообщений с:

  1. все столбцы и все строки из posts таблицы, где users.id = «как угодно»
  2. все реакции post из post_reactions таблицы, в которой posts.id = пост_реакции.post_id
  3. ключевые слова реакции («счастливый», «грустный» и т. Д.) Из reactions таблицы, В которой reaction.id = post_reactions.идентификатор реакции_id
  4. имя отображения из users таблицы, связанной с каждой реакцией post, путем сопоставления post_reaction.user_id с users.id и возвращает users.disaplay_name из таблицы users.
 SELECT 
       post_reactions.post_id,
       post_reactions.reaction_id,
       post_reactions.user_id,
       posts.content,
       posts.content,
       posts.create_timestamp,
       posts.id,
       posts.image_url,
       posts.updated_at,
       reactions.id,
       reactions.keyword,
       users.display_name,
       users.id
FROM public.posts
         LEFT OUTER JOIN users ON (users.id = post_reactions.user_id)
         LEFT OUTER JOIN post_reactions ON (posts.id = post_reactions.post_id)
         LEFT OUTER JOIN reactions ON (reactions.id = post_reactions.reaction_id)
WHERE users.id = 'foobar'
;
  

Ответ №1:

Таблицы должны быть включены в FROM предложение, прежде чем на них можно будет ссылаться в ON :

 FROM public.posts LEFT JOIN
     post_reactions
     ON posts.id = post_reactions.post_id LEFT JOIN
     reactions
     ON reactions.id = post_reactions.reaction_id LEFT JOIN
     users
     ON users.id = post_reactions.user_id
   
  

Я бы также посоветовал вам использовать псевдонимы таблиц, чтобы запрос было легче писать и читать:

 FROM public.posts p LEFT JOIN
     post_reactions pr
     ON p.id = pr.post_id LEFT JOIN
     reactions r
     ON r.id = pr.reaction_id LEFT JOIN
     users u
     ON u.id = pr.user_id
  

Псевдонимы, однако, должны использоваться на протяжении всего запроса.