我为我的博客网站加载帖子这个漂亮而简洁的方式来适应指定的页面:
$end = $count - ($page * $ppp); //count = select max(id) from art;
$start = $count- ($page * $ppp) - ($ppp-1);
$nxtpage = $page +1; //this is set beforehand in case no posts exists
$prvpage = $page == 0 ? 0 : $page -1;
$sql = "SELECT
a.id AS id,
a.nazwa AS nazwa,
a.data AS data,
a.wstep AS wstep,
a.imgs AS imgs,
a.zdj AS zdj,
GROUP_CONCAT(t.nazwa) all_tags
FROM
art a INNER JOIN tagart ta ON a.id = ta.id INNER JOIN tags t ON t.idt = ta.idt
WHERE a.id BETWEEN $start AND $end
GROUP BY a.id
ORDER BY a.id desc";
这样我只能加载由博客页面(分页)依赖的指定数量的帖子。 它有一个很大的问题。 让我们说客户半年前犯了writing BLACK PPL somewhere in one article之类的错误,现在他必须删除它。
或者甚至更好,必须从中删除大约10个帖子。删除中间帖时,整个算法都会搞砸,因为它会根据帖子的ID来扫描帖子。
所以我在这里的问题是选择我可以使用的帖子的更好方法,总是得到正确的帖子顺序?
答案 0 :(得分:4)
看起来您正在尝试实现自己的LIMIT
方式,这是一个处理分页的MySQL功能。除了手动定义您的开始和结束ID之外,您应该查看订阅帖子,然后只提取下一个X
帖子,无论他们的ID是什么。这就是你如何做到的
$start = ($page - 1) * $ppp;
$sql = "SELECT
a.id AS id,
a.nazwa AS nazwa,
a.data AS data,
a.wstep AS wstep,
a.imgs AS imgs,
a.zdj AS zdj,
GROUP_CONCAT(t.nazwa) all_tags
FROM
art a INNER JOIN tagart ta ON a.id = ta.id INNER JOIN tags t ON t.idt = ta.idt
GROUP BY a.id
ORDER BY a.id DESC
LIMIT $start,$ppp";
LIMIT用作
LIMIT 5 #Fetch first 5 items
或
LIMIT 5,10 #Starting from the 5th item, fetch the next 10 items
答案 1 :(得分:0)
不使用max(id)
来确定帖子数量,而是使用count(id)
或count(*)
来实际计算。如果帖子被删除,则计数可以考虑到这一点。
在选择查询中,使用limit
选择要显示的帖子范围。
答案 2 :(得分:0)
正如您已经想到的那样,您不应该依赖MAX(id)来计算记录数。 我只想使用单独的计数查询来获取计数。它简单而且相对便宜:
SELECT COUNT (id) FROM art
正如其他人已经提到的那样,使用LIMIT进行分页而不是通过id进行限制。