Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 以有效的方式计算行的秩_Php_Mysql_Sql_Ranking_Rank - Fatal编程技术网

Php 以有效的方式计算行的秩

Php 以有效的方式计算行的秩,php,mysql,sql,ranking,rank,Php,Mysql,Sql,Ranking,Rank,我有下表,其中包含大约10M的数据: CREATE TABLE IF NOT EXISTS `tbl_site_visit` ( `id` int(11) NOT NULL, `siteURL` varchar(50) NOT NULL, `userHash` varchar(32) NOT NULL, `timestamp` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 另外,siteURL、userUID、

我有下表,其中包含大约10M的数据:

CREATE TABLE IF NOT EXISTS `tbl_site_visit` (
  `id` int(11) NOT NULL,
  `siteURL` varchar(50) NOT NULL,
  `userHash` varchar(32) NOT NULL,
  `timestamp` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
另外,
siteURL、userUID、timestamp
也有索引

现在,我想根据上述数据快速有效地计算一个站点的排名。我编写了以下查询,但排名不正确,计算排名也需要大约
40~60秒

SET @prevRank := -1, @rankCounter := 0;

SELECT siteURL, siteRank FROM ( 
    SELECT *, @rankCounter := IF(@prevRank = visitCount, @rankCounter, @rankCounter + 1) AS siteRank, @prevRank := visitCount AS dummyRank FROM (
        SELECT siteURL, COUNT(1) AS visitCount
        FROM tbl_site_visit
        GROUP BY siteURL
        ORDER BY visitCount DESC
    ) coreTable
) rankedTable
WHERE rankedTable.siteURL = "www.google.com"
LIMIT 1;

有没有办法解决这个问题,或者有没有统计公式来计算排名

您犯的一个错误是,您正在计算所有站点的排名,然后选择该站点的结果

您应该只计算该站点的排名

SET @prevRank := -1, @rankCounter := 0;

SELECT siteURL, siteRank FROM ( 
    SELECT *, @rankCounter := IF(@prevRank = visitCount, @rankCounter, @rankCounter + 1) AS appRank, @prevRank := visitCount AS dummyRank FROM (
        SELECT siteURL, COUNT(1) AS visitCount
        FROM tbl_site_visit WHERE siteURL = "www.google.com"
        GROUP BY siteURL
        ORDER BY visitCount DESC
    ) coreTable
) rankedTable

这应该只计算“www.google.com”的排名并返回其数据。一些外部
SELECT
s可以删除,但这取决于您想对数据做什么。

不,这种方法不是真的,用这种方法计算的排名是1,而实际排名是4!那么你的排名值应该根据其他网站来计算?
SELECT  @rank := @rank+1 AS rank, siteURL, visitCount
    FROM  
      ( SELECT  @rank := 0 ) AS z
    JOIN  
      ( SELECT  siteURL, COUNT(*) AS visitCount
            FROM  tbl_site_visit
            GROUP BY  siteURL 
      ) AS x
    ORDER BY  visitCount DESC;