SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.05.2011 16:31:53

levak
Участник
Зарегистрирован: 15.05.2011
Сообщений: 6

Помогите с запросом

Добрый день!
Есть такая вот проблемка:
если таблица с пользователями. У каждого есть поле `raiting` и `id`
так вот, необходимо вытащить место пользователя в рейтинге.
Т.е. если делать запрос :
SELECT * FROM `users` ORDER BY `raiting` DESC
выводится список пользователей с рейтингом по убыванию. Каков должен быть запрос, что бы, допустим, зная `id` пользователя можно вытащить его порядковое место в новом запрос?
Заранее спасибо.

Отредактированно levak (15.05.2011 16:33:50)

Неактивен

 

#2 15.05.2011 18:35:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите с запросом

Можно так:

select count(*)+1 from `users` where `raiting` > (select `raiting` from `users` where id=%ИД_ЮЗЕРА%);


Возможно, можно оптимальнее smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 15.05.2011 18:44:44

levak
Участник
Зарегистрирован: 15.05.2011
Сообщений: 6

Re: Помогите с запросом

У меня была такая же реализация и я в неё верил, пока рейтинги у всех пользователей были разные. но как только как минимум у двух пользователей появлялись одинаковые рейтинги у них места были одинаковые...

Неактивен

 

#4 15.05.2011 18:50:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите с запросом

Будет элемент рандомности, если не задать дополнительный критерий сортировки. Например, если рейтинг одинаковый, то выше тот, у кого меньше id.

P.S. Позицию юзера можно определять для всех одновременно в общем запросе:

SET @pos=0; SELECT *,@pos:=@pos+1 AS pos FROM (SELECT * FROM `users` ORDER BY `raiting` DESC) tbl;

Неактивен

 

#5 15.05.2011 19:13:17

levak
Участник
Зарегистрирован: 15.05.2011
Сообщений: 6

Re: Помогите с запросом

Спасибо! Это именно то, что я хочу, НО:
1. как это запихнуть в PHP, т.к. функции mysql в PHP поддерживают только один запрос, а с SET @pos=0; это уже два запроса
2. мне необходимо вытащить место определённого пользователя с `id`
как мне быть?
заранее спасибо!

Неактивен

 

#6 15.05.2011 19:24:17

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите с запросом

1. Сначала выполняете первый запрос, затем отдельной функцией mysql_query() второй

2. Напрасно вы не хотите детерминизировать свою задачу определив позицию однозначно. Если все же настаиваете, то запрос, который Вам нужен такой:

SET @pos=0;
 SELECT * FROM (SELECT *,@pos:=@pos+1 AS pos FROM (SELECT * FROM `users` ORDER BY raiting DESC) tbl) tbl2 WHERE id=42;

Неактивен

 

#7 15.05.2011 19:34:49

levak
Участник
Зарегистрирован: 15.05.2011
Сообщений: 6

Re: Помогите с запросом

Я так понимаю tbl = tbl2 = `users`

Неактивен

 

#8 15.05.2011 19:42:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите с запросом

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

Неактивен

 

#9 15.05.2011 19:43:44

levak
Участник
Зарегистрирован: 15.05.2011
Сообщений: 6

Re: Помогите с запросом

А, т.е. так и оставить?

Неактивен

 

#10 15.05.2011 20:20:46

levak
Участник
Зарегистрирован: 15.05.2011
Сообщений: 6

Re: Помогите с запросом

В любом случаем, наиогромнейшее Вам спасибо!
Вы меня очень сильно выручили!
Моих благодарностей не хватит, что бы реально отразить ту помощь, которую Вы мне оказали!
Ещё раз спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson