将 NOT IN 值放入 postgres SQL 中的数组中

Get the NOT IN values into an array in postgres SQL

我希望获得一组结果,其中我收到 user_id 和用户尚未评论的书籍集合。我想要以下作为所需的输出:

user_id Array of books not reviewed
1 {Array of books not reviewed}
2 {Array of books not reviewed}.

目前有两个 table 需要从中提取此查询。一个包含“评论”,其中包含评论的 user_id 和用户已评论的 book_id。 book_id 是包含所有书籍列表的“书籍”table 的外键。因此,对于输出中的每个 user_id,我都需要图书的总清单,不包括每个用户已评论的图书。

有关评论和书籍,请参阅下面的插入语句tables:

评论 tables -

CREATE TABLE reviews (
    review_id SERIAL PRIMARY KEY,
    rating INT CHECK (rating BETWEEN 0 AND 10),
    review_text TEXT,
    book_id INT REFERENCES books(id),
    user_id INT
);

table 数据片段示例:

review_id rating book_id. user_id
1 8 2 1
2 6 3 3

书籍table-

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title VARCHAR(100),
    price_in_pence INTEGER,
    quantity_in_stock INTEGER
);

书籍数据片段示例:

id title price_in_pence quantity_in_stock
1 bookname 549 12
2 LOTR 799 9

我已经尝试了以下查询,但这不是动态的,并且仅适用于输入的 user_id(在下面使用“**”标识):

SELECT r.user_id, 
       array( SELECT b.title 
              FROM books b 
              WHERE b.id NOT IN (SELECT r.book_id 
                                 FROM reviews r  
                                 WHERE user_id = <b>'4'</b>)
               ) AS Books_not_reviewed 
FROM reviews r
GROUP BY (r.user_id);

抱歉,我对 SQL 有点陌生。任何帮助将不胜感激。我正在使用 Postgres 版本 14.1

如果将 userid 作为参数并使用准备好的语句,则可以使查询动态化。

此外,下面的查询可以为您提供每个用户 NOT 评论的所有书籍的列表,您可以修改查询以满足您的需要。

select u.userid, array( select bookid from books 
where bookid not in (select 
           bookid from reviews r 
            where r.userid=u.userid) )
    from users u