【问题标题】:Find the ranking of an integer in mysql [duplicate]在mysql中查找整数的排名[重复]
【发布时间】:2012-12-27 00:02:52
【问题描述】:

可能重复:
Mysql rank function

我有以下国家/地区表

country  clicks
-------  ------
0        222
66       34 
175      1000
45       650

在这种情况下,我如何获得国家 45 的排名,即 2?

【问题讨论】:

  • 我假设你想在 mysql 中使用它?请注意mysql是存储数据而不是实现逻辑。虽然,可以做到。但根据我的经验,大多数应用程序的瓶颈是数据库而不是业务逻辑层

标签: php mysql sql ranking


【解决方案1】:

由country ASC订购:

SELECT 1+COUNT(*) AS ranking
FROM countryTable
WHERE country < 45 ;

由clicks DESC订购:

SELECT 1+COUNT(*) AS ranking
FROM countryTable AS t
  JOIN countryTable AS c
      ON c.clicks > t.clicks
WHERE t.country = 45 ;

【讨论】:

  • 不包括有平局的情况。
  • @SalmanA 为什么,我认为确实如此。它不仅涵盖没有国家/地区45的情况。
  • sqlfiddle.com/#!2/b8975/3:两个国家的点击次数相同。排名是 1、2、2、4(更好的 1、2、3、4 或 1、2、2、3)。 OP没有提到是否/如何处理关系。
  • @SalmanA 我同意关系可能会使事情复杂化(取决于 OP 希望如何处理它们)。我的查询模拟了RANK() 函数:Ranking Functions。 1、2、3、4 将是ROW_NUMBER(),并且需要澄清应如何处理联系。在标准 SQL 中,1、2、2、3 将是 DENSE_RANK()。
【解决方案2】:

你可以像下面这样获得2个等级:

Select * from tabeName order by clicks limit 1,1

3 级:

Select * from tabeName order by clicks limit 2,1

【讨论】:

  • 嘿,我怎么给了同样的答案却被否决了???? :-D damm ...人们是一群人,而不是你。你的答案是最好的;-) 我会支持你
【解决方案3】:
SELECT *
FROM 
(
  SELECT  @ranking:= @ranking + 1 rank,
          a.country,
          a.clicks
  FROM    tableName a, (SELECT @ranking := 0) b
  ORDER BY a.clicks DESC
) s
WHERE country = 45

【讨论】:

  • 不包括平局的情况。一个额外的变量会有所帮助。
【解决方案4】:

X 是您需要查找的等级:

SELECT * FROM T ORDER BY clicks DESC LIMIT X-1,1

【讨论】:

    【解决方案5】:

    这是另一种(非常快)方式(尽管限制为 256 行):

    SELECT country
         , clicks
         , FIND_IN_SET(clicks,(SELECT GROUP_CONCAT(DISTINCT clicks ORDER BY clicks DESC) FROM country_clicks)) rank
    FROM country_clicks
    

    或者,如果您愿意...

    SELECT FIND_IN_SET(clicks,(SELECT GROUP_CONCAT(DISTINCT clicks ORDER BY clicks DESC) FROM country_clicks)) rank
       FROM country_clicks
      WHERE country = 45;
    

    【讨论】:

      【解决方案6】:

      这将显示国家 45 的正确排名 (2)。您没有指定如何对平局进行排名,因此您可能需要更改比较以适合您。不存在的国家排名为 0。

      SELECT COUNT(*) rank 
      FROM countryTable a
      JOIN countryTable b
        ON a.clicks <= b.clicks
      WHERE a.country = 45
      

      SQLfiddle here.

      【讨论】:

      • 它有效。但是(如果你不介意的话,有点不相关)我如何访问 php 中的返回值?我试过 $row = mysql_fetch_array($result) 或 die(mysql_error());回声 $row['rank'];但它返回空白
      • @PutraKg 听起来是正确的方法,但不确定您的问题可能是什么。您可能希望更改为 mysqli_* 函数,因为不推荐使用 mysql_* 函数,但在这种情况下两者都应该工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2018-07-28
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多