每个使用
mysql的人都知道:
SELECT sql_CALC_FOUND_ROWS ..... FROM table WHERE ... LIMIT 5,10;
并在运行之后:
SELECT FOUND_ROWS();
解决方法
不,没有(至少
not as of July 2007).我担心你不得不诉诸:
BEGIN ISOLATION LEVEL SERIALIZABLE; SELECT id,username,title,date FROM posts ORDER BY date DESC LIMIT 20; SELECT count(id,date) AS total FROM posts; END;
isolation level需要是SERIALIZABLE以确保查询不会在SELECT语句之间看到并发更新.
但是,另一个选择是使用触发器在行被插入或删除时对行进行计数.假设您有以下表格:
CREATE TABLE posts ( id SERIAL PRIMARY KEY,poster TEXT,title TEXT,time TIMESTAMPTZ DEFAULT Now() ); INSERT INTO posts (poster,title) VALUES ('Alice','Post 1'); INSERT INTO posts (poster,title) VALUES ('Bob','Post 2'); INSERT INTO posts (poster,title) VALUES ('Charlie','Post 3');
然后,执行以下操作以创建一个名为post_count的表,其中包含帖子中行数的运行计数:
-- Don't let any new posts be added while we're setting up the counter. BEGIN; LOCK TABLE posts; -- Create and initialize our post_count table. SELECT count(*) INTO TABLE post_count FROM posts; -- Create the trigger function. CREATE FUNCTION post_added_or_removed() RETURNS TRIGGER AS $$ BEGIN IF TG_OP = 'DELETE' THEN UPDATE post_count SET count = count - 1; ELSIF TG_OP = 'INSERT' THEN UPDATE post_count SET count = count + 1; END IF; RETURN NULL; END; $$LANGUAGE plpgsql; -- Call the trigger function any time a row is inserted. CREATE TRIGGER post_added_or_removed_tgr AFTER INSERT OR DELETE ON posts FOR EACH ROW EXECUTE PROCEDURE post_added_or_removed(); COMMIT;
请注意,这会保留帖子中所有行的运行计数.要保持某些行的运行计数,您必须调整它:
SELECT count(*) INTO TABLE post_count FROM posts WHERE poster <> 'Bob'; CREATE FUNCTION post_added_or_removed() RETURNS TRIGGER AS $$ BEGIN -- The IF statements are nested because OR does not short circuit. IF TG_OP = 'DELETE' THEN IF OLD.poster <> 'Bob' THEN UPDATE post_count SET count = count - 1; END IF; ELSIF TG_OP = 'INSERT' THEN IF NEW.poster <> 'Bob' THEN UPDATE post_count SET count = count + 1; END IF; END IF; RETURN NULL; END; $$LANGUAGE plpgsql;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。