代码之家  ›  专栏  ›  技术社区  ›  Cam

MySQL:选择一个赢家,返回他们的排名

  •  0
  • Cam  · 技术社区  · 14 年前

    早些时候我问过 this question 根据他们的得分,他们基本上询问了如何在一张有很多赢家的桌子上列出10个赢家。

    回答了这个问题。

    现在,我要在表中搜索给定的赢家x,并找出 位置 当桌子按点排序时,他在。

    例如,如果这是表:

         Winners:
    NAME:____|__POINTS:
    Winner1  |  1241
    Winner2  |  1199
    Sally    |  1000
    Winner4  |  900
    Winner5  |  889
    Winner6  |  700
    Winner7  |  667
    Jacob    |  623
    Winner9  |  622
    Winner10 |  605
    Winner11 |  600
    Winner12 |  586
    Thomas   |  455
    Pamela   |  434
    Winner15 |  411
    Winner16 |  410
    

    这些是我想要做的可能的输入和输出:

    Query:  "Sally", "Winner12", "Pamela", "Jacob"
    Output: 3        12          14        623
    

    我该怎么做?是否可以,只使用MySQL语句?或者我也需要PHP?

    这就是我想要的:

    WHEREIS FROM Winners WHERE Name='Sally' LIMIT 1
    

    思想?

    编辑-注意:您不必处理两个赢家拥有相同积分的情况(为了简单起见,假设不会发生这种情况)。

    2 回复  |  直到 14 年前
        1
  •  4
  •   mjv    14 年前

    我想这会给你带来理想的结果。请注意,我正确处理目标赢家与另一个赢家平分的情况。(两个职位相同)。

    SELECT COUNT(*) + 1 AS Position
    FROM myTable
    WHERE Points > (SELECT Points FROM myTable WHERE Winner = 'Sally')
    

    编辑 :
    我想把插头插上 艾布拉姆斯 “答案在很多方面都比上面的好。
    例如,它允许列出所有(或多个)获奖者及其当前职位。
    另一个优点是,它允许表达一个更复杂的条件,以表明一个给定的玩家领先于另一个玩家(见下文)。阅读 难以置信的人 他的评论认为不会有“领带”提示我去调查这个问题;这个查询可以稍微修改如下,以处理玩家拥有相同点数的情况(这些玩家以前会得到相同的位置值,现在位置值更进一步与它们的相对起始值相关)。

    SELECT w1.name, (
      SELECT COUNT(*)
      FROM winners AS w2
      WHERE (w2.points > w1.points) 
         OR (W2.points = W1.points AND W2.Start < W1.Start)  -- Extra cond. to avoid ties.
    )+1 AS rank
    FROM winners AS w1
    -- WHERE W1.name = 'Sally'   -- optional where clause
    
        2
  •  2
  •   Ignacio Vazquez-Abrams    14 年前
    SELECT w1.name, (
      SELECT COUNT(*)
      FROM winners AS w2
      WHERE w2.points > w1.points
    )+1 AS rank
    FROM winners AS w1