0

我有 2 张桌子:

collections_books (collection_id, book_id)
users_collections (user_id, collection_id, access)

我正在使用PostgreSQL.

以下查询为我提供了book_id按 s 分组的collection_ids 列表。问题是,由于我使用的是 where 条件,结果仅限于 user_id = 3允许的集合。

但是,我想要所有的collection_ids 和相应book_id的 s

  1. 作为一个数组,如果 user_id 有access = allow
  2. 作为一个空数组,如果oruser_id中不存在users_collectionsuser_id != allow
SELECT c.collection_id, ARRAY_AGG(c.book_id)
FROM collections_books AS c
LEFT JOIN users_collections AS u
ON c.collection_id = u.collection_id
WHERE 
  u.access = 'allow' AND
  u.user_id = 3
GROUP BY c.collection_id;
4

2 回答 2

2

你检查 array_length()。如果小于 1,则返回值为 {null} 的数组

如果您想从 collections_books 中获取所有 collection_id,但只有在 u.access = 'allow' AND u.user_id = 4 否则为 null 的情况下才能获取 book_id 数组,然后使用以下查询:

SELECT c.collection_id, 
    (
        CASE 
             WHEN max(u.access) = 'allow' AND max(u.user_id) = 4
             THEN ARRAY_AGG(c.book_id)
             ELSE '{null}'::int[] 
        END
    )
    FROM collections_books AS c
    LEFT JOIN users_collections AS u
    ON c.collection_id = u.collection_id
    GROUP BY c.collection_id;
于 2021-03-25T05:35:59.793 回答
1

请查看下面的答案,让我知道它是否返回您想要的输出:

模式和插入语句:

     create table users_collections (user_id int, collection_id int, access varchar(20));
     insert into users_collections values(3, 1, 'allow');
     insert into users_collections values(3, 2, 'allow');
     insert into users_collections values(4, 3, 'allow');
     insert into users_collections values(3, 5, 'not allow');

 
     create table collections_books (collection_id int, book_id int);
     insert into collections_books values(2,24);
     insert into collections_books values(3,35);
     insert into collections_books values(3,25);
     insert into collections_books values(1,36);
     insert into collections_books values(1,22);
     insert into collections_books values(1,24);
     insert into collections_books values(2,34);
     insert into collections_books values(5,344);
     insert into collections_books values(6,474);

询问:

     SELECT c.collection_id, (CASE WHEN max(u.access) = 'allow' AND max(u.user_id) = 3
     THEN ARRAY_AGG(c.book_id)
     ELSE '{null}'::int[] END)
     FROM collections_books AS c
     LEFT JOIN users_collections AS u
     ON c.collection_id = u.collection_id
     GROUP BY c.collection_id;
 

输出:

 |collection_id | case      |
 |------------: | :---------|
 |            3 | {35,25}   |
 |            5 | {NULL}    |
 |            6 | {NULL}    |
 |            2 | {24,34}   |
 |            1 | {36,24,22}|

db<小提琴在这里

于 2021-03-25T06:40:13.097 回答