Php MySQL查找给定时间段内的前x%
我担心这会很快变得相当复杂,但我想知道最好的方法是什么来显示按“受欢迎程度”排序的最新“活动”——这是用“喜欢”或“观点”来衡量的(如果可能的话,甚至两者都可以——将喜欢计算为2倍的观点?) 因此,如果我有一个数据库,里面满是观点和/或喜欢的帖子,我希望能够在过去24小时内显示前5%最受欢迎的帖子 我有3个表,一个用于帖子,两个用于喜欢和视图(1行=1个喜欢/视图) 表1=“员额” 表2=“发布内容” 表3=“posts\U视图” 使用MySQL+PHP,运行此查询的最佳方式是什么,以便根据我的文章的总体流行程度对其进行排序Php MySQL查找给定时间段内的前x%,php,mysql,sql,percentile,Php,Mysql,Sql,Percentile,我担心这会很快变得相当复杂,但我想知道最好的方法是什么来显示按“受欢迎程度”排序的最新“活动”——这是用“喜欢”或“观点”来衡量的(如果可能的话,甚至两者都可以——将喜欢计算为2倍的观点?) 因此,如果我有一个数据库,里面满是观点和/或喜欢的帖子,我希望能够在过去24小时内显示前5%最受欢迎的帖子 我有3个表,一个用于帖子,两个用于喜欢和视图(1行=1个喜欢/视图) 表1=“员额” 表2=“发布内容” 表3=“posts\U视图” 使用MySQL+PHP,运行此查询的最佳方式是什么,以便根据我的
非常感谢,Tim,我将给你一些伪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;
SET@foo=0.05*从帖子中选择count(*)(时间戳<今天-24小时);
根据“按流行限制顺序选择文章、总结(喜欢)*2+总结(视图)作为流行内容(表格连接)准备STMT”;
使用@foo执行STMT;
关于,我无法测试这一点,因为我现在没有可访问的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\u limit
-该参数应为过去24小时内所有帖子的COUNT()
的5%。至少,最好的开始是显示表结构。并显示您已尝试的内容。Tim,我们希望看到表格结构和你现在尝试过的内容…我已经添加了表格结构,我尝试了一些方法@daniel,但我正在努力…Tim,同样,不要在你的帖子中添加签名。我不认为把时间缩短到24小时是个好主意。一篇帖子可能会流行很长时间。但要求是:“我希望能够在过去24小时内展示前5%最受欢迎的帖子。”因此,非常受欢迎的老帖子是无关紧要的。。。
post_id | user_id
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;
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