【问题标题】:How to fetch the top comments?如何获取热门评论?
【发布时间】:2013-12-05 02:20:40
【问题描述】:

我在其他任何地方都进行了搜索,但找不到任何参考或教程来向您展示或解释展示顶级 cmets 的最佳方式(如 facebook 或 youtube 上的那个)。

我已经完成了获取记录(根据他们的投票排序的 20 个顶级 cmets)。但是我一直卡在的地方是我应该如何获取接下来的 20 个顶级 cmets

下面是我的表格的样子:

cmets 表

id  |  comments       | comment_id
1      Hi               nj3b21das
2      Cool             jh3lkjb32
3      How are you?     bn32j1343
4      What's up?       3kl213543

votes_cmets 表(1 等于赞成,-1 等于反对)

id  |  user_id       | comment_id   |  votes
1      4326542         nj3b21das        1
2      2356453         jh3lkjb32        -1
3      8764354         bn32j1343        1
4      3213543         3kl213543        1

然后我通过使用下面的查询将这两个表组合起来以获取排名靠前的 cmets:

    SELECT `comments`.comments, SUM(`votes_comments`.votes) AS total_votes
    FROM comments
    LEFT JOIN `votes_comments `                 
    ON `votes_comments`.comment_id = `comments`.comment_id
    GROUP BY comment_id
    ORDER BY total_votes
    DESC
    LIMIT 20

上面的查询将获取前 20 个排名靠前的 cmets。但是,如果我想使用 ajax 获取接下来的 20 个结果并显示以前的记录,那么最好的选择是什么?

注意:请记住,投票是不断变化的。因此,获取下一个前 20 个 cmets 可能会导致已获取的 cmets 重复。处理此问题的最佳方法是什么(如 Facebook、Youtube 等)。

【问题讨论】:

标签: php mysql sql ajax facebook


【解决方案1】:

我能想到的方法有两种。

一个是,您可以将当前显示的评论 id 存储在一个数组中,并通过您的 ajax 调用传递这些评论,然后在 SQL 语句中过滤排除这些评论 id 并获取其余的顶级 cmets,一旦您得到响应,追加这些 id 到同一个数组,你可以继续这个。

或者

您在页面加载时定义指示服务器时间的时间戳(例如:var loadTimeStamp = "<?php echo time(); ?>"),然后将此值与限制一起作为 Ajax 调用的一部分传递。

然后在服务器端,您可以排除在此时间之后添加的任何 cmets,从而保留 cmets 列表。但要使其正常工作,您需要存储人们评论和查看 Facebook 为获取更多 cmets 所做的 AJAX 调用的时间,他们似乎正在遵循这种类型的方法,因为我可以看到他们通过调用传递时间戳(我可能错了,但是他们的 AJAX 调用传递了时间戳,所以我假设..)

使用此方法,您可以更进一步,使用此时间以及基本的 ajax 长轮询技术来通知用户自页面加载/上次加载新 cmets 以来的任何新 cmets,类似于 Facebook 和 Twitter供稿。

希望你明白了。

【讨论】:

  • 太棒了!很高兴它有帮助:)
【解决方案2】:

您只需要在LIMIT 中精确说明您想从哪个响应开始顺便说一句,我在GROUP BY 中添加了votes_comments. 以避免在MySQL 中出现模棱两可的错误。

SELECT `comments`.comments, SUM(`votes_comments`.votes) AS total_votes
FROM comments
LEFT JOIN `votes_comments`                 
ON `votes_comments`.comment_id = `comments`.comment_id
GROUP BY `votes_comments`.comment_id
ORDER BY total_votes
DESC
LIMIT 20, 20

【讨论】:

  • 就像我说的“我想使用 ajax 获取接下来的 20 个结果并显示之前的记录。”执行 LIMIT 20, 20 之类的操作可能会导致重复已获取的评论,因为投票不断变化。
  • 但是您只需要精确地调用 AJAX Url 中的参数,例如 ?begin=20&number=20 并通过将 begin 变量存储在隐藏输入中(或通过 @987654330 @ 如此处所述:ivangabriele.com/how-to-set-a-global-variable-in-javascript)。你在检测滚动时增加这个变量,你有很多 jquery & co 插件。
  • 这里有一些插件可以做到这一点:jscroll.comimakewebthings.com/jquery-waypoints(非常易于使用)。
  • 那么如果我这样做“?begin=20&number=20”呢?就像我说的那样“限制 20、20 可能会导致重复评论,因为投票不断变化,所以已经提取的评论”要我再重复一遍吗? “ LIMIT 20, 20 可能会导致重复已获取的评论,因为投票不断变化”。处理我在 Ajax url 中传递的参数或 scroll 的函数没有问题。以防万一您已经忘记了“ LIMIT 20, 20 可能会导致由于投票不断变化而已经获取的评论重复”
  • 那么您只有两个选择:或者您刷新从结果 0 到实际 number 的所有内容(这取决于滚动位置),或者您必须创建一个脚本来存储 @987654332 @ 和 votes_number 在一个数组中,检查某些 cmets 的 votes_number 是否已更改(通过使用存储在 $_SESSION var:comment_id-votes_number|comment_id-votes_number|... 中的缓存系统的 ajax 调用),并通过 jquery 移动 cmets。您只需为每个匹配comment_id 的 div 提供一个 id。然后将ajax返回的ids+votes与JS数组进行比较。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多