我的数据包括可以被分为多个类别(恐怖、戏剧、喜剧等)的书籍。用户可以订阅一个类别,我希望能够对具有指定类别的所有图书的books表执行分页查询。示例架构:
CREATE TABLE IF NOT EXISTS books (
bookid uuid PRIMARY KEY,
categories uuid[],
name text,
author text,
releasedate timestamp
);
CREATE TABLE IF NOT EXISTS categories (
categoryid uuid PRIMARY KEY,
name text
);
CREATE TABLE IF NOT EXISTS users (
userid uuid PRIMARY KEY,
name text
);
CREATE TABLE IF NOT EXISTS catsubscribers (
categoryid uuid REFERENCES categories,
userid uuid REFERENCES users,
PRIMARY KEY (categoryid, userid)
);
CREATE TABLE IF NOT EXIST bookcats (
bookid uuid REFERENCES books,
categoryid uuid REFERENCES categories,
PRIMARY KEY (bookid, categoryid)
);
CREATE OR REPLACE FUNCTION getBooksBySubscribedCategory(me uuid, ofst integer, lim integer)
RETURNS TABLE(bookid uuid, categories uuid[], name text, author text, releasedate timestamp) AS $$
DECLARE cid RECORD;
BEGIN
FOR cid IN (SELECT categoryid FROM catsubscribers WHERE userid = me)
LOOP
RETURN QUERY SELECT bks.bookid, bks.categories, bks.name, bks.author, bks.releasedate
FROM (SELECT bookid, categories, name, author, releasedate FROM books WHERE bookid IN (SELECT bookid FROM bookcats WHERE categoryid = cid ) AS bks
ORDER BY releasedate DESC
OFFSET ofst
LIMIT lim;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
此函数获取用户订阅的类别数组,并在bookcats连接表中循环每个类别和查询书籍。这是我的蛮力第一次尝试--很难看,我不确定是否因为循环而得到正确的分页。有更好的办法吗?