我是sql的新手,所以我需要你的帮助!我需要一个存储过程来获取一定数量的文章,其中包含一些偏移量和总数,以便进行分页... 这是一个正确的代码还是有更好的方法?将执行多少查询,1为ctid,1为总计,1为内容数据?
DELIMITER $$
CREATE PROCEDURE `getArticles`(`offset` INT, `count` INT)
BEGIN
DECLARE ctid, total INT;
SET ctid = (SELECT id FROM content_types WHERE name='article');
SET total = (SELECT COUNT(*) FROM content WHERE content_type = ctid);
SELECT *, total FROM content
WHERE content_type = ctid
LIMIT count
OFFSET offset;
END $$
DELIMITER ;
答案 0 :(得分:2)
您可以尝试利用SQL_CALC_FOUND_ROWS
选项和FOUND_ROWS()
功能
SQL_CALC_FOUND_ROWS和FOUND_ROWS()在以下情况下非常有用 您希望限制查询返回的行数,但也要 确定完整结果集中的行数而不运行 再次询问。一个示例是一个呈现分页的Web脚本 显示包含指向显示其他部分的页面的链接 搜索结果。使用FOUND_ROWS()可以确定多少 其余结果需要其他页面。
据说你的程序看起来像
DELIMITER $$
CREATE PROCEDURE get_articles(IN _offset INT, IN _count INT, OUT _total INT)
BEGIN
SELECT SQL_CALC_FOUND_ROWS *
FROM content c JOIN content_types t
ON c.content_type = t.id
WHERE t.name = 'article'
LIMIT _offset, _count;
SET _total = FOUND_ROWS();
END$$
DELIMITER ;
样本用法:
SET @total = 0;
CALL get_articles(0, 3, @total);
SELECT @total;
这是 SQLFiddle 演示
答案 1 :(得分:0)
我想你看起来像这样的查询。如果不太复杂,请尝试在同一查询中执行所有操作。
SELECT c.*,
(SELECT COUNT(*) FROM content AS c1 WHERE c1.content_type = ct.id) AS total
FROM content AS c
INNER JOIN content_type AS ct ON c.content_type = ct.id
WHERE ct.name = 'article'
LIMIT offset, count;