2016-01-19 3 views
0

Это то, что я в настоящее время:Как получить рейтинг баллов в MySQL с помощью LIMIT?

SELECT id, score, username, 
CASE 
WHEN @prevRank = score THEN @curRank 
WHEN @prevRank := score THEN @curRank := @curRank + 1 
END AS rank 
FROM users u, 
SELECT @curRank :=0, @prevRank := NULL) r 
ORDER BY score DESC LIMIT 5, 5; 

Я хочу, чтобы следующие 5 рядов из 5-я строки, но ранжирования возобновляется 1. Как я могу получить рейтинг, чтобы начать с правильным ранжированием по отношению ко всем строкам ?

Образец данных: http://pastebin.com/i3PsRWdg

Everyone 

+----+--------+-----------+------+ 
| id | scores | username | rank | 
+----+--------+-----------+------+ 
| 24 |  23 | fl  | 1 | 
| 3 |  9 | test  | 2 | 
| 6 |  9 | usernine | 2 | 
| 5 |  7 | test3  | 3 | 
| 11 |  7 | test9  | 3 | 
| 26 |  5 | tryagain | 4 | 
| 12 |  5 | newUser | 4 | 
| 7 |  3 | test6  | 5 | 
| 14 |  1 | new3  | 6 | 
| 4 |  1 | test2  | 6 | 
| 13 |  0 | new2  | NULL | 
| 25 |  0 | newu  | 6 | 
| 23 |  0 | new  | 6 | 
| 22 |  0 | usernine | 6 | 
| 21 |  0 | usernine | 6 | 
| 20 |  0 | test  | 6 | 
| 19 |  0 | usernine | 6 | 
| 18 |  0 | usernine | 6 | 
| 17 |  0 | usernine | 6 | 
| 15 |  0 | usernine | 6 | 
| 16 |  0 | test9  | 6 | 
+----+--------+-----------+------+ 

LIMIT 1,5 -> correct 

+----+--------+-----------+------+ 
| id | scores | username | rank | 
+----+--------+-----------+------+ 
| 3 |  9 | test  | 1 | 
| 6 |  9 | usernine | 1 | 
| 5 |  7 | test3  | 2 | 
| 11 |  7 | test9  | 2 | 
| 26 |  5 | tryagain | 3 | 
+----+--------+-----------+------+ 

LIMIT 5,5 -> incorrect 

+----+--------+----------+------+ 
| id | scores | username | rank | 
+----+--------+----------+------+ 
| 12 |  5 | newUser | 1 | 
| 26 |  5 | usernine | 1 | 
| 7 |  3 | test6 | 2 | 
| 4 |  1 | test2 | 3 | 
| 14 |  1 | new3  | 3 | 
+----+--------+----------+------+ 

Should be this: 

+----+--------+----------+------+ 
| id | scores | username | rank | 
+----+--------+----------+------+ 
| 12 |  5 | newUser | 4 | 
| 26 |  5 | usernine | 4 | 
| 7 |  3 | test6 | 5 | 
| 4 |  1 | test2 | 6 | 
| 14 |  1 | new3  | 6 | 
+----+--------+----------+------+ 
+0

Попробуйте использовать другую переменную 'init rank' для использования в лимитах и ​​в расчете ранга? Не уверен, что mysql разрешит это – Sebas

+0

Будет очень полезно, если вы включите образец данных и вы хотите получить результат. Мне не ясно, в чем вы хотите –

+0

@JuanCarlosOropeza http://pastebin.com/i3PsRWdg –

ответ

1

Вы пытаетесь решить проблему на неправильном уровне. Ваша база данных не думает в строках, она думает в наборах данных. Мир состоит из аккуратных прямоугольных таблиц, а не строк или полей. Вся концепция «добавления в строку», которую вы используете с хакером @curRank, на самом деле не работает в SQL Server, потому что она правильно обрабатывает весь набор как атомную сущность.

Что возвращает нас к тому, что ваша проблема связана с архитектурой, а не с базой данных. База данных несет ответственность только за хранение, организацию, объединение и возврат данных. Нумерация строк, безусловно, не является, она принадлежит либо вашей бизнес-логике, либо вашей логике представления.

Чтобы решить эту проблему в бизнес-логике, где вы будете комбинировать с этим запросом 5, вы можете сохранить полученные строки в пронумерованном массиве. Например, на уровне презентации веб-сайта вы можете использовать упорядоченный список, например <ol start="6">.

+0

Итак, вы говорите, что я должен рассчитать все это, поместить его в массив, а затем выбрать правильные, когда это необходимо? –

+0

Я частично не согласен, особенно потому, что я очень часто использую 'ROW_NUMBER()' в SQL Server, и если бы у вас была такая функция на MySql, это было бы намного проще. –

+0

@Pallas Я говорю, пусть база данных делает то, что хорошо - хранить и извлекать данные. Нехорошо применять вертикальную бизнес-логику к данным, например, «сравнивать с предыдущими строками, а затем предпринимать действия или нет». –

0

Вы можете создать одну фильм переменных, чтобы держать след row_number

Также я использую IF() вместо случае, потому что вы версия есть ошибка, когда score = 0 продуктов ранг null и техник его подводит создать rank 7

SQL Fiddle Demo

SELECT * 
FROM (
    SELECT id, score, username, 
     @curRank := IF(@prevRank = score, 
         @curRank , 
         IF(@prevRank := score, @curRank + 1, @curRank + 1) 
        ) as rank, 
     (@row := @row + 1) as rn 
    FROM users u 
    CROSS JOIN (SELECT @curRank := 0, @prevRank := NULL, @row := 0) r 
    ORDER BY score DESC 
    ) T 
WHERE rn > 5 
    AND rn <= 10 

OUTPUT

| id | score | username | rank | rn | 
|----|-------|----------|------|----| 
| 26 |  5 | tryagain | 4 | 6 | 
| 12 |  5 | newUser | 4 | 7 | 
| 7 |  3 | test6 | 5 | 8 | 
| 14 |  1 |  new3 | 6 | 9 | 
| 4 |  1 | test2 | 6 | 10 | 
Смежные вопросы