MySQL:选择一名获胜者,返回他们的排名

时间:2010-03-19 23:24:53

标签: php mysql where

早些时候我问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 个答案:

答案 0 :(得分:4)

我认为这会让你得到理想的结果。请注意,我正确处理了目标获胜者与其他获胜者并列积分的情况。 (两者都有相同的位置)。

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

修改
我想“插上” Ignacio Vazquez-Abrams 的答案,这在几个方面比上面的要好。
例如,它允许列出所有(或几个)获胜者及其当前位置 另一个优点是它允许表达更复杂的条件来指示给定的玩家领先于另一个玩家(见下文)。阅读 incrediman 的评论意味着没有“关系”促使我调查这个;查询可以稍微修改如下,以处理当玩家具有相同数量的点时的情况(此类玩家以前已被赋予相同的位置值,现在位置值进一步与其相对的起始值相关联)。

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

答案 1 :(得分:2)

SELECT w1.name, (
  SELECT COUNT(*)
  FROM winners AS w2
  WHERE w2.points > w1.points
)+1 AS rank
FROM winners AS w1