2016-11-02 3 views
1

Я пытаюсь сделать запрос, и я уже искал ответ на stackof, но не нашел подходящего для моих потребностей. У меня есть таблица с именем player, в которой есть два столбца, «ник» и «оценка». Я использую этот запрос, чтобы получить лучшие 5 игроков:Выберите ранг конкретного запроса sql игрока

SELECT nickname, score 
FROM player 
ORDER BY score DESC LIMIT 5; 

и я получил это как ответ:

nickname - score:  
zod  - 30 
ciao  - 20 
jiji  - 20 
mayina - 20  
jon  - 0. 

Теперь я хотел бы иметь ранг одного игрока, давайте скажем, «джиджи» и получить 3 в результате, потому что это третий результат в списке.

Я пробовал много запросов, как

SELECT COUNT(*) AS rank 
FROM player 
WHERE score >= (SELECT score FROM player WHERE nickname = 'jiji') 

, но они всегда возвращаются 4 для «Дзидзи» или «чао», который является ранг последнего игрока, который получает 20 очков, как в этой таблице.

Как я могу получить 3 для «jiji», вместо этого? Большое спасибо.

+0

Будьте осторожны при пометке ваших вопросов. Это явно mysql, а не sql-сервер. Это НЕ то же самое. –

+0

Вам нужно использовать аналитическую функцию для решения проблемы ур – Teja

+0

смотрите здесь: http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select – Galz

ответ

1

Использование часто используемых определений, то ранга для jiji будет:

SELECT count(*) + 1 AS rank 
FROM player 
WHERE score > (SELECT score FROM player WHERE nickname = 'jiji'); 

Это возвращает " 2 ", потому что есть связи, когда счет = 30.

Если вы хотите, чтобы ранг был стабильным и отличался для каждой строки, вам нужен дополнительный ключ. Очевидным ключом (в данном случае) является nickname:

SELECT count(*) AS rank 
FROM player p CROSS JOIN 
    (SELECT score FROM player WHERE nickname = 'jiji') s 
WHERE p.score > s.score or 
     (p.score = s.score and p.nickname <= 'jiji'); 
+0

Это действительно то, что я пытался сделать (спасибо), но я только заметил, что phpmyadmin не заказывает также по алфавитному порядку ключа (ник), когда я делаю первый запрос. Итак, как я могу получить этот «SELECT-ник», оценка FROM player ORDER BY score DESC LIMIT 5' запрос, чтобы заказать по нику в алфавитном порядке? Я пробовал что-то, но ничего не работало. (Я немного смущен, потому что прошло несколько часов с тех пор, как я пытаюсь преодолеть это, извините ...) –

3

Попробуйте это:

SET @rank=0; 
SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 

Правильный комментарий по этому поводу не является устойчивым в случае бигованных связей. Для того, чтобы сделать ее более стабильной, мы можем изменить сортировку быть основано на счет, а затем прозвище:

SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score, nickname 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 
+0

Я только что пришел с тем же запросом, прежде чем проверять здесь снова, и это работает (спасибо!) Но теперь, когда я использую это на php, мне нужно сделать два отдельных запроса: один для ' set @ rank = 0', а другой для остальных. И, пытаясь сделать это со вторым запросом, он говорит мне: «Ошибка. Неизвестный столбец« rank »в« списке полей » –

+0

Код, который я использую: ' $ querysetRank = "set @rank = 0"; if ($ result = mysqli_query ($ database, $ querysetRank)) { $ queryPlayerRank = "SELECT rank FROM (SELECT @rank: = rank + 1 как rank, nickname FROM player order by score desc) как pl, где pl.nickname = '$ nickname' "; if (! ($ resultZ = mysqli_query ($ database, $ queryPlayerRank))) // ошибка else // do things' –

+0

@JulsA Я думаю, вам нужно убедиться, что оба запроса выполняются из того же сеанса, поэтому '@ rank' доступен во втором запросе. – Galz

Смежные вопросы