Php 以有效的方式计算行的秩
我有下表,其中包含大约10M的数据: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、
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;