繁体   English   中英

遍历行,直到找到变量,然后计算行数

[英]Loop through rows until you find a variable and then count the number of rows

我正在建立一个排名系统,我有很多匹马,并且在赛马资料上,我想根据获胜的数量来回应马的排名。 第一,第二,第三等

这是我的包含马匹的MySQL表,在PHP中如何计算行数以获得马匹的排名?

这是我的表格,例如,如果我在“ Pauls”个人资料中,我该如何回响他在全球排名中排名第四?

在此处输入图片说明

1。

select h.*, @rownum := @rownum + 1 AS rank
from horses h, (SELECT @rownum := 0) r
order by h.first DESC, h.second DESC, h.third DESC

2。

SELECT * FROM
(
select h.*, @rownum := @rownum + 1 AS rank
from horses h, (SELECT @rownum := 0) r
order by h.first DESC, h.second DESC, h.third DESC
) t
WHERE id = 428

根据优先级在多个列上使用“订购依据”。

$sql = "SELECT
@rownum := @rownum + 1 as row_number
FROM    horses
CROSS JOIN (SELECT @rownum := 0) r
WHERE name = "Paul"
ORDER BY 
        first ASC,
        second ASC,
        third ASC";

现在您可以从查询中获取任何用户的排名值。

两个查询以获取您的搜索记录的位置

set @name='Paul',@nr = 0,  @namenr = 0;
select @namenr as nr from 
(SELECT @nr:=@nr+1,if(name=@name, @namenr := @nr,@namenr=@namenr),name FROM SOME_TABLE order by first DESC ) subsel where subsel.name = @name;

第二个查询将返回您要查找的带有nr列的一条记录。

根据您的计分系统,这可能是适合您的解决方案:

说您的“第一”代表3分,“第二”代表2分,“第三”代表1分。

这样,您可以根据总数计算出最高得分的赛马。

例:

保罗有2个“第一”,0个“第二”和1个“第三”,得到7分。 弗莱彻有2个“第一”,没有“第二”和“第三”,他得到6分。

计算所有点的总和,然后按该字段DESC排序。

查询示例:

SELECT (`first`*3)+(`second`*2)+(`third`*1) AS `total_score` FROM `horses` ORDER BY `total_score` DESC

额外的“排名”字段

SET @rank=0;
SELECT @rank:=@rank+1 AS `rank`, (`first`*3)+(`second`*2)+(`third`*1) AS `total_score` FROM `horses` ORDER BY `total_score` DESC

使用以下查询,您可以拥有自己的表格,以及旁边的每匹马的排名:

SELECT *,
@curRank := @curRank + 1 AS rank
FROM (SELECT @curRank := 0) r, horses
order by first desc, second desc, third desc

我正在使用(SELECT @curRank := 0)来初始化查询中的curRank

要获得特定马匹的排名,您只需要计算排名在其上方的记录数即可; 按行构造函数排序是完成此操作的一种非常简洁的方法:

SELECT COUNT(*) + 1
FROM   horses
WHERE  (first, second, third)
     > (SELECT first, second, third FROM horses WHERE id = ?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM