0

之前我问过这个问题,基本上是问如何在一个有很多获胜者的表格中,根据他们的分数列出 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

想法?

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

4

2 回答 2

3

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

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
于 2010-03-19T23:33:15.043 回答
2
SELECT w1.name, (
  SELECT COUNT(*)
  FROM winners AS w2
  WHERE w2.points > w1.points
)+1 AS rank
FROM winners AS w1
于 2010-03-19T23:37:01.480 回答