在我的MySQL数据库中,我有一个超过1000万行的表(PERSONS),两个重要的列是:
我想知道ID = randomid
的人的等级我想回到他的等级"这取决于他的观点。 但他的排名不是确切的行号,而更像是百分比层。喜欢:"你在前5%"或"你在10% - 15%"。
层当然,我可以通过将行除以行总数来查询表并将行号转换为图层%。但我的问题是,用LIMIT X,1来抓住几行会更快(用10M +行),其中X将是表格百分比100,95,90,85 ..的一行。下一步:检查此行的点是否低于当前人员点,如果是,则抓住下一层%行,否则返回上一层行。
在人员表中有9列,其中包含2个bigint,4个varchars 150,1个日期和2个布尔值。
当然我更倾向于获得确切的排名,但是根据我的测试,这很慢并且需要至少几秒钟,我的扫描仪可以在几百秒内完成。
另外,当有多个具有相同点的图层时,我建议的方式并不精确,但它并不需要那么精确,所以我们可以忽略这个事实。
额外的信息,我用PHP编程,所以如果在PHP + MySQL中有一个特定的解决方案,它也会很好。
最后,值得一提的是,桌子每小时增加20k行(每天几乎500k)。
我感谢所有的帮助。
答案 0 :(得分:0)
你可以试试这个。我首先使用 more 点计算行数,然后在其中添加一行,以防有多个行具有相同的点数。因此,如果有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