Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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 使用百分比选择(限制X,1)获取行数的最快方法?_Php_Mysql_Sql_Rowcount - Fatal编程技术网

Php 使用百分比选择(限制X,1)获取行数的最快方法?

Php 使用百分比选择(限制X,1)获取行数的最快方法?,php,mysql,sql,rowcount,Php,Mysql,Sql,Rowcount,在我的MySQL数据库中,我有一个超过1000万行的表(PERSONS),其中两个重要的列是: 身份证 要点 我想知道ID=randomid的人的排名 我想回到这个人的“等级”,这取决于他的分数但是他的排名不是确切的行数,而是更像一个百分比层。比如:“你在前5%,”或者“你在第10%-15%的层次” 当然,我可以查询表并将行数除以总行数,将其转换为层%。但我的问题是,如果只抓取限制为X,1的几行,其中X将是百分比为100,95,90,85的一行,速度会更快吗(10米以上的行)。。桌子的另一边

在我的MySQL数据库中,我有一个超过1000万行的表(PERSONS),其中两个重要的列是:

  • 身份证
  • 要点
我想知道ID=randomid的人的排名

我想回到这个人的“等级”,这取决于他的分数但是他的排名不是确切的行数,而是更像一个百分比层。比如:“你在前5%,”或者“你在第10%-15%的层次”

当然,我可以查询表并将行数除以总行数,将其转换为层%。但我的问题是,如果只抓取限制为X,1的几行,其中X将是百分比为100,95,90,85的一行,速度会更快吗(10米以上的行)。。桌子的另一边。下一步:检查该行的点是否低于当前人员点,如果是,则抓取下一层%row,如果不是,则返回上一层行

在persons表中有9列,其中有2个bigint、4个varchars 150、1个date和2个boolean

当然,我更愿意得到确切的行排名,但从我的测试来看,这是缓慢的,至少需要几秒钟,用我的wat,它可以在几百秒钟内完成

另外,我建议的方法在有多个层具有相同的点时并不精确,但它不需要那么精确,所以我们可以忽略这个事实

额外的信息,我用PHP编程,所以如果在PHP+MySQL中有一个特定的解决方案,那也很好

最后,值得一提的是,该表每小时增长2万行(几乎每天500行)


谢谢你的帮助。

你可以试试这个。我首先计算多个点的行数,然后再加上一行,以防多个行的点数相同。因此,如果有10行具有相同的点数,那么它们都与该组中的第一行具有相同的排名

SELECT SUM(CASE WHEN points > (SELECT POINTS FROM YOUR_TABLE WHERE ID = randomid) THEN 1 ELSE 0 END) + 1 as Rank,
       (SUM(CASE WHEN points > (SELECT POINTS FROM YOUR_TABLE WHERE ID = randomid) THEN 1 ELSE 0 END) + 1) / COUNT(*) as Pct
FROM   YOUR_TABLE
如果这很慢,我将运行两个查询。首先获取该ID的点,然后将其插入到第二个查询中以确定秩/pct

SELECT POINTS 
FROM   YOUR_TABLE
WHERE  ID = randomid
然后计算秩和pct,从上面插入点

SELECT SUM(CASE WHEN points > POINTS THEN 1 ELSE 0 END) + 1 as Rank,
       (SUM(CASE WHEN points > POINTS THEN 1 ELSE 0 END) + 1) / COUNT(*) as Pct
FROM   YOUR_TABLE

这似乎是一个关于mysql和百分位数的问题。我说的对吗?是的,我指的是百分位数Pct就是我所说的百分比计算。你可以称它为任何东西。在一个有600k行的测试表上,它非常快,0,3秒。这真是太好了。此解决方案是否比具有行数的选择更快?我对SQL很陌生,所以我不完全理解您的查询:)我对stackoverflow也很陌生,正如您所知。有很多不同的方法可以做到这一点。这可能不是最快的,但它相对整洁。最快的方法可能是进行3次调用并将结果存储在PHP变量中,然后进行计算。首先,您将获得相关ID的点数
从您的\u表中选择点数,其中ID=randomid
,然后从您的\u表中获取排名
选择计数(*)+1,其中POINTS>
,然后从\u表中获取总记录
选择计数(*)。