Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL查找给定时间段内的前x%_Php_Mysql_Sql_Percentile - Fatal编程技术网

Php MySQL查找给定时间段内的前x%

Php MySQL查找给定时间段内的前x%,php,mysql,sql,percentile,Php,Mysql,Sql,Percentile,我担心这会很快变得相当复杂,但我想知道最好的方法是什么来显示按“受欢迎程度”排序的最新“活动”——这是用“喜欢”或“观点”来衡量的(如果可能的话,甚至两者都可以——将喜欢计算为2倍的观点?) 因此,如果我有一个数据库,里面满是观点和/或喜欢的帖子,我希望能够在过去24小时内显示前5%最受欢迎的帖子 我有3个表,一个用于帖子,两个用于喜欢和视图(1行=1个喜欢/视图) 表1=“员额” 表2=“发布内容” 表3=“posts\U视图” 使用MySQL+PHP,运行此查询的最佳方式是什么,以便根据我的

我担心这会很快变得相当复杂,但我想知道最好的方法是什么来显示按“受欢迎程度”排序的最新“活动”——这是用“喜欢”或“观点”来衡量的(如果可能的话,甚至两者都可以——将喜欢计算为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