php - 高效评论系统分页查询

标签 php mysql sql mysqli pagination

所以我一直在网上查找有关分页的信息。 据我所知,有 3 种,(LIMIT,OFFSET)a,(WHERE id > :num ORDER BY id LIMIT 10)b 和(光标分页)c,就像 facebook 和 twitter 上使用的那样。

我决定在我的项目中使用“b”选项,因为它看起来非常简单且高效。

我正在尝试创建某种类似“facebook”的帖子和评论系统,但没那么复杂。

我有一个帖子和评论排名系统,以及随帖子一起获取的每个帖子的前 2 条评论。

当人们点击查看更多评论时,将获取每个特定帖子的其余评论。

这是对帖子评论的查询:

SELECT 
  c.commentID,
  c.externalPostID, 
  c.numOfLikes, 
  c.createdAt, 
  c.customerID, 
  c.numOfComments,
  (CASE WHEN cl.customerID IS NULL THEN false ELSE true END) isLiked,
  cc.text,
  cu.reputation,
  cu.firstName,
  cu.lastName,
  c.ranking
  FROM 
    (SELECT * 
     FROM Comments 
     WHERE Comments.externalPostID = :externalPostID) c
    LEFT JOIN CommentLikes cl ON cl.commentID = c.commentID AND cl.customerID = :customerID
    INNER JOIN CommentContent cc ON cc.commentTextID = c.commentID
    INNER JOIN Customers cu ON cu.customerID = c.customerID 
  ORDER BY c.weight DESC, c.createdAt ASC LIMIT 10 OFFSET 2

偏移 2 是因为之前有 2 条评论被提取为前 2 条评论。

我正在寻找方法similar to this每次通过数据库寻找下 10 条评论,而无需像 LIMIT,OFFSET 那样遍历所有行

问题是我有两列正在对结果进行排序,但我不允许我使用此方法:

SELECT * FROM Comments WHERE id > :lastId LIMIT :limit;

非常感谢各位的帮助!

到目前为止的解决方案:

为了实现高效分页,我们需要一列,其中包含尽可能多的唯一值,这些值形成一个序列来帮助我们对数据进行排序,并且分页。

我的示例使用两列对数据进行排序,因此会出现问题。 我所做的是结合时间(asc排序顺序)和评论的权重(desc排序顺序),权重是总共多少用户正在参与该评论。

我通过从 DateTime 格式中获取纯 int 数字并将该数字除以权重来实现它(我们将结果称为“排名”)。 这样,有权重的评论的排名总是比没有权重的评论低。

剥离后的 DateTime 是一个 14 位 int ,因此将其除以另一个数字应该不会出现问题。

现在我们有一栏对评论进行排序,参与度较高的评论位于顶部,之后是较旧的评论,依此类推,直到最后发布的新评论。

现在我们可以使用这种可扩展的高性能分页方法:

SELECT * FROM Comments WHERE ranking > :lastRanking ORDER BY ASC LIMIT :limit;

最佳答案

好吧,我想说的是其他方式,在我看来这非常有用。

$rowCount = 10; //this is count of row that is fetched every time
$page = 1; //this is for calculating offset .  you must increase only this value every time    
$offset = ($page - 1) * $rowCount; //offset

SELECT 
  c.commentID,
  c.externalPostID, 
  c.numOfLikes, 
  c.createdAt, 
  c.customerID, 
  c.numOfComments,
  (CASE WHEN cl.customerID IS NULL THEN false ELSE true END) isLiked,
  cc.text,
  cu.reputation,
  cu.firstName,
  cu.lastName,
  c.ranking
  FROM 
    (SELECT * 
     FROM Comments 
     WHERE Comments.externalPostID = :externalPostID) c
    LEFT JOIN CommentLikes cl ON cl.commentID = c.commentID AND cl.customerID = :customerID
    INNER JOIN CommentContent cc ON cc.commentTextID = c.commentID
    INNER JOIN Customers cu ON cu.customerID = c.customerID 
  ORDER BY c.ranking DESC, c.createdAt ASC LIMIT $rowCount OFFSET $offset

可能有错误,因为我没有检查,请不要介意

关于php - 高效评论系统分页查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573816/

相关文章:

php - 将 PHP 翻译成 Python(Rest-API 连接)

mysql - 通过另一列对联合选择中的列进行排序

mysql - 从mysql的大表中快速选择随机行

php - Jquery/PHP + 创建 MySQL 日期类型

mysql - 如何对多个表中的一条记录进行 GROUP

sql - 在查询中找不到匹配项时如何显示默认值?

php - 如何将此代码修复为唯一的用户名/电子邮件注册

php - php mysql_fetch_array 是否适用于 html 输入框?

php - 我如何判断 MySQL 查询是否在 PHP 中未返回任何内容?

php - laravel 在插入一行后无法检索 ID