将 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
我希望获得一组结果,其中我收到 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