MySQL: ВЫБЕРИТЕ Победителя, вернув его ранг - PullRequest
0 голосов
/ 20 марта 2010

Ранее я задавал этот вопрос , который в основном спрашивал, как составить список 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 ]

4 голосов
/ 20 марта 2010

Я думаю, что это даст вам желаемый результат. Обратите внимание, что я правильно обрабатываю случаи, когда целевой победитель привязан к очкам с другим победителем. (Оба получают одно и то же положение).

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

Редактировать
Я бы хотел «заткнуть» ответ Игнасио Васкес-Абрамс , что в нескольких отношениях лучше, чем выше.
Например, он позволяет перечислить всех (или нескольких) победителей и их текущую позицию.
Другое преимущество состоит в том, что оно позволяет выразить более сложное условие, чтобы указать, что данный игрок опережает другого (см. Ниже). Чтение комментария 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
2 голосов
/ 20 марта 2010
SELECT w1.name, (
  SELECT COUNT(*)
  FROM winners AS w2
  WHERE w2.points > w1.points
)+1 AS rank
FROM winners AS w1
...