2013-02-28 4 views
4

Okay поэтому у меня есть таблица, которая имеет следующийПолучить звание, на основе баллов, из неупорядоченного MySql базы данных, когда дано имя пользователя

KEY username password score 

Вышеуказанные столбцы не в каком-либо определенном порядке.

Я хочу отправить свою базу данных имя пользователя и отправить мне обратно, какой ранг это имя пользователя основано на его оценке. Так, например, если у меня было 10 человек, а 3-й человек имеет самый высокий балл. Когда я передаю имя пользователя 3-го лица, я хочу отправить его обратно.

Возможно ли это?

Я пытался что-то вроде этого

$result = mysql_query("SELECT * FROM tablename where username='$username' ORDER BY score DESC"); 

, но он не кажется, чтобы дать мне номер строки

+2

Вы используете [** устаревший ** API баз данных] (http://stackoverflow.com/q/12859942/19068) и должны использовать [современную замену] (http://php.net/manual /en/mysqlinfo.api.choosing.php). Вероятно, вы также уязвимы для [SQL-инъекций] (http://bobby-tables.com/) **, что современный API упростит [защиту] (http://stackoverflow.com/questions/ 60174/best-way-to-prevent-sql-injection-in-php). – Quentin

+0

@JohnConde Я спрашиваю его снова, потому что на него не ответили, и он был похоронен, поэтому вероятный капюшон ответа был не очень хорош. Я удалил другой и снова спросил. Я не вижу в этом никакой проблемы. –

+1

SO не нравится, когда пользователи делают это. Вы всегда можете отредактировать свой вопрос, чтобы улучшить его, и это автоматически увеличит его. Теперь вся история исчезла, что было бы полезно для других пользователей. –

ответ

3

Это будет занимать ряды, имеющие одинаковый балл.

SELECT d.*, c.ranks 
FROM 
     (
      SELECT Score, @rank:[email protected]+1 Ranks 
      FROM 
        (
         SELECT DISTINCT Score 
         FROM tableName a 
         ORDER BY score DESC 
       ) t, (SELECT @rank:= 0) r 
     ) c 
     INNER JOIN tableName d 
      ON c.score = d.score 
// WHERE d.username = 'Helen' 

, например

KEY  username password score Ranks 
1  Anna  123   5  3 
2  Bobby  345   6  2 
3  Helen  678   6  2 
4  Jon   567   2  4 
5  Arthur  ddd   8  1 

для лучшей производительности, добавьте INDEX на колонке Score,

ALTER TABLE tableName ADD INDEX (Score) 
+0

FYI, они хотят только получить одного пользователя за раз. Когда они спросили тот же вопрос прошлой ночью, мы смогли вытащить это из них, но они, очевидно, забыли упомянуть об этом снова, когда задавали этот же вопрос ... снова. –

+1

@JohnConde Я знаю, запрос обрабатывает дубликат. Если бы я не использовал переменные, * в моем примере *, 'Bobby' и' Helen' имели бы другой ранг. –

+0

Спасибо за помощь @JW, когда я вернусь с работы, я попробую ваше решение. –

2
SELECT 
    (SELECT COUNT(*)+1 FROM tablename WHERE score > t.score) as rank, 
    * 
FROM 
    tablename t 
where 
    username='$username' 

ORDER BY в запросе бесполезно, так как вы только из одной записи ,

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