Как получать Сообщения От всех людей, За которыми я Слежу?

#node.js #postgresql

Вопрос:

Я использую Postgresql для хранения своих данных. Это таблица, в которой я храню все твиты, сделанные любым пользователем. Твиты хранятся в массиве json.

 CREATE TABLE tweets (
    tweet_user_id UUID NOT NULL,
    user_tweets jsonb[]
);
 

В этой таблице я храню всех подписчиков и подписчиков пользователя.

 CREATE TABLE friends_details(
    user_id UUID,
    followers UUID[] DEFAULT '{}',
    following UUID[] DEFAULT '{}'
);
 

Запрос, который я использую для получения всех сообщений от людей, за которыми я слежу, таков:-

 SELECT user_tweets F
FROM tweets 
WHERE tweet_user_id IN (SELECT following FROM friends_details 
                        WHERE user_id = '$1' , [user_uid]);

 

Но я получаю эту ошибку:-

оператор не существует: uuid = uuid[]

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

Ответ №1:

Вы не можете сравнить скаляр и массив с = . Возможно, вы ищете это:

 SELECT DISTINCT tweets.user_tweets F
FROM tweets
   JOIN friends_details ON tweets.tweet_user_id = ANY (friends_details.following)
WHERE friends_details.user_id = $1;
 

Ответ №2:

вместо IN вы должны использовать = ЛЮБОЙ(следующий)

Ваш запрос должен выглядеть так.

 SELECT user_tweets F
FROM friends_details
  JOIN tweets ON tweets.tweet_user_id = ANY(friends_details.following)
WHERE friends_details.user_id = $1;
 

Обратите внимание, я изменил форму запроса, чтобы использовать join вместо подзапроса. Это связано с тем, что в PostgreSQL ЛЮБОЙ(массив) и ЛЮБОЙ(подзапрос) действуют по-разному. Первый сравнивает левую часть уравнения со всеми элементами массива, второй сравнивает его со всеми строками в подзапросе, поэтому использование ЛЮБОГО(подзапроса) приведет к ошибке:
SQL Error [42883]: ERROR: operator does not exist: uuid = uuid[]

Вы можете использовать UNNEST, чтобы сохранить SQL как можно более похожим на тот, который вы используете в настоящее время:

 SELECT user_tweets F
FROM tweets 
WHERE tweet_user_id IN (SELECT UNNEST(following) FROM friends_details 
                        WHERE user_id = $1);