#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);