2010-03-19 1 views
0

Раньше я спросил this question, в котором в основном просили, как перечислять 10 победителей в таблице со многими победителями, согласно их пунктам.MySQL: ВЫБЕРИТЕ Победитель, возвращая свой ранг

Это был дан ответ.

Теперь я ищу для поиска данного победителя 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

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

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

Edit:
Я хотел бы, чтобы "заткнуть" ответа Ignacio Vazquez-Abrams », который несколько способов, лучше, чем выше.
Например, он позволяет перечислять всех (или нескольких) победителей и их текущую позицию.
Другим преимуществом является то, что он позволяет выразить более сложное условие, указывающее, что данный игрок опережает другой (см. Ниже). Чтение комментарий к комментарию ultiman о том, что не будет «связей», побудило меня заглянуть в это; запрос может быть слегка изменен, как описано ниже, чтобы справиться с ситуацией, когда игроки имеют одинаковое количество очков (таким игрокам ранее было присвоено то же значение позиции, теперь значение позиции дополнительно привязано к их относительным значениям Начала).

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 
+3

Я думаю, что вы имеете в виду 'WHERE Points> ...' –

+0

(+1) на самом деле, никогда не будет два победителя с той же позиции, как они первый упорядоченный по точкам, а затем Start , а Start - УНИКАЛЬНО. Мой запрос на выбор 10 выглядит следующим образом: 'SELECT * FROM Winners ORDER BY Points DESC, Start ASC' – Cam

+0

Изучил его еще и попробовал. Это отлично работает; Благодаря! – Cam

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