【问题标题】:Loop through rows until you find a variable and then count the number of rows循环遍历行,直到找到一个变量,然后计算行数
【发布时间】:2016-05-24 09:05:18
【问题描述】:

我正在建立一个等级系统,我有很多马匹,我想在马的配置文件中根据获胜次数来呼应马匹的等级。第一,第二,第三等等。

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

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

【问题讨论】:

  • 你如何定义保罗在第四位?
  • 据我所知,Nam3 排在第 4 位。他有 2 个第一、2 个第二和 2 个第三。而保罗有2个第一,只有1个三分之一。您需要仅按第一列还是第二和第三列对其进行排序?
  • 最好是获胜,第二/第三作为后备

标签: php mysql


【解决方案1】:

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

【讨论】:

  • 这很好用,并创建了一个带有等级的临时表,但是我如何根据马的 ID 提取等级?
  • 你可以试试第二个查询
【解决方案2】:

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

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】:

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

    说你的“第一”表示 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
    

    【讨论】:

    • 这正是我要做的,我要在表中添加另一列总“分数”,但即使我有每匹马的总分怎么办在按“分数?使用 PHP 还是 SQL? 排序后,我计算了它们向下的行数
    • 我更新了我的答案以添加一个您可以使用的“排名”字段(尚未测试过)
    【解决方案4】:

    通过以下查询,您可以获得您的表格,旁边是每匹马的排名:

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

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

    【讨论】:

      【解决方案5】:

      根据优先级在多个列上使用 Order By。

      $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";
      

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

      【讨论】:

      • 不应该都是DESC吗?
      • 这意味着拥有 3 个“第一”但 0 个“第二”的马会比拥有 2 个“第一”和 20 个“第二”的马高。
      • 这不考虑一个人5秒可以先高1?完全取决于你如何计算它
      • 这太好了,假设我的 $varible 是“Paul”或 Pauls ID,我如何在 PHP 中输​​出他的位置?
      • @Alvi_1987 因为获得最多第一名的是第一名,而不是最后一名。
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        相关资源
        最近更新 更多