【发布时间】:2018-06-07 20:09:39
【问题描述】:
我的数据包含可以分配多个类别(恐怖、戏剧、喜剧等)的书籍。用户可以订阅一个类别,我希望能够对具有指定类别的所有书籍的书籍表执行分页查询。示例架构:
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 联结表中的书籍。这是我的蛮力第一次尝试——它很丑,而且我不确定是否因为循环而使分页正确。有没有更好的方法来做到这一点?
【问题讨论】:
标签: sql postgresql stored-procedures