MySQL在给定时间段内找到前x%

时间:2013-02-05 13:20:58

标签: php mysql sql percentile

我担心这可能会很快变得相当复杂,但我想知道最好的方法是显示最新的“活动”按“受欢迎程度”排序 - 这是'喜欢'或'观点'中的措施(甚至也许两者,如果可能的话 - 计算喜欢2倍的观点?)。

因此,如果我有一个包含观点和/或喜欢的帖子的数据库,我希望能够在过去24小时内显示前5%最受欢迎的帖子。

我有3个表格,一个用于帖子,两个用于喜欢和视图(1行= 1个喜欢/查看)

表1 =“帖子”

id | title | timestamp | etc.

表2 =“posts_likes”

post_id | user_id

表3 =“posts_views”

post_id | user_id

使用MySQL + PHP,运行此查询以按照其整体计算流行度排序我的帖子的最佳方法是什么?

非常感谢,蒂姆

2 个答案:

答案 0 :(得分:1)

我会给你一些伪sql只是为了显示我会使用的想法,你可以添加缺少的位并让它工作。 它假设前5%是基于帖子的数量,但如果它是基于喜欢加视图的分数,应该是微不足道的调整。

SET @foo=0.05 * select count(*) from posts where (timestamp < today - 24 hours); 
PREPARE STMT FROM 'SELECT posts,sum(likes) * 2 + sum(views) as POPULAR FROM (tables joined) ORDER BY popular LIMIT ?';
EXECUTE STMT USING @foo;

此致

答案 1 :(得分:1)

我无法测试这个,因为我现在没有MySQL服务器可访问 - 但是下面的查询应该让你开始:

SELECT p.id, p.title, ((COUNT(l.id) * 2) + COUNT(v.id)) AS popularity 
    FROM posts p 
        LEFT JOIN posts_likes l ON l.post_id = p.id 
        LEFT JOIN posts_views v ON v.post_id = p.id 
    WHERE p.timestamp > (UNIX_TIMESTAMP()-86400)
    GROUP BY p.id
    ORDER BY popularity DESC LIMIT :return_limit

运行查询时,您需要传递参数:return_limit - 在过去24小时内,该参数应为所有帖子的COUNT()的5%。