所以我一直在网上查找有关分页的信息。 据我所知,有 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/