我论坛中的帖子都有一个单独的永久链接。
帖子已分页,用户可以按日期和评级对帖子进行排序。
访问固定链接时,由于分页,需要计算帖子所在的页面。
帖子以自动递增的 ID 存储在 mysql innodb 表中。
目前,当帖子按分数(评级)排序时,我使用以下方法进行计算:
<?php
// These variables originate from the corresponding uri segments
// For example: http://domain.tld/topics/[ID]/[SLUG]/[POST_ID]
$post_id = $uri->segment(4);
$topic_id = $uri->segment(2);
$post_per_page = 10;
$query = $db->query('SELECT id FROM topic_posts WHERE topic_id = ' . $topic_id . ' ORDER BY score desc');
foreach ($query as $key => $post)
{
if ($post->id == $post_id)
{
$postOnPage = ceil(($key + 1) / $post_per_page);
break;
}
}
但是,帖子数量会不断增加,获取所有帖子似乎很尴尬。
对于日期排序,我使用以下查询,但它不适用于评级排序,因为帖子 ID 不按递增顺序:
SELECT CEIL((COUNT(*) + 1) / $posts_per_page) FROM topic_posts WHERE topic_id = $topic_id AND id < $post_id;
那么...我怎样才能避免 php foreach 循环并通过 db 查询实现相同的效果?
最佳答案
我只是想到了一种完全不同的方法,所以我将其添加为第二个答案,而不是编辑第一个答案。
为了使其按预期工作,您始终必须在排序中包含至少一个唯一列作为平局打破者。我假设您的许多帖子实际上都有相同的评级,所以也许您应该例如 ORDER BY Score DESC, id DESC
来另外排序与最新的评级相同的帖子(我认为这可能无论如何,对于论坛来说是有意义的)。
然后,对于上面提到的排序顺序,您可以使用以下查询获取在相关帖子之前排序的帖子数量:
SELECT COUNT(1) FROM topic_posts
WHERE topic_id = $topic_id
AND ((score > $post_score) OR (score = $post_score AND id > $post_id));
这是一个您可以根据需要使用 indizes 等进行优化的查询。
关于php - 从分页论坛中的帖子永久链接确定页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255560/