Mysql Помогите составить запрос для рейтинга

XELAD

Новичок
Доброго времени суток!
Буду очень благодарен, если кто-нибудь поможет составить корректный запрос для рейтинга в некой игре.
Задача запроса: вывести данные игрока и 10 человек, у которых рейтинг хуже плюс 10 человек у которых рейтинг лучше, с сортировкой по рейтингу.
То, что написал я, не работает как ожидалось. Выкладываю, чтобы вы ужаснулись :)
mysql_query("
(SELECT ID, Rating FROM USERS WHERE Rating>=(SELECT Rating FROM USERS WHERE id='$id') ORDER BY Rating DESC LIMIT 10)
UNION
(SELECT ID, Rating FROM USERS WHERE Rating<(SELECT Rating FROM USERS WHERE id='$id') ORDER BY Rating DESC LIMIT 10)
");


Большое спасибо заранее!
P.S. пользовательскую переменную на внутренний запрос - пробовал, она потом в вывод лезет, мне это не нужно.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Если данные игрока у тебя уже есть, то известен и рейтинг, потому ты можешь напрямую подставить рейтинг а запрос и не делать SUB SELECT, то есть
SELECT ID, Rating FROM USERS WHERE Rating >= $Rating ORDER BY Rating DESC LIMIT 10

И что значит:

То, что написал я, не работает как ожидалось.
 

XELAD

Новичок
С точки зрения компьютерной логики - всё верно. Однако, я желал, чтобы была найдена позиция игрока с id в таблице с сортировкой по Rating, затем были выбраны 10 позиций над его строкой и 10 под. Т.е., если у игрока место 69, то в запросе бы были выбраны (59-68) + 69 + (70-79). Данную выборку я пытаюсь получить. Но получаю (0-9) + (70-79)

$pos_result = mysql_query("SELECT COUNT(*)+1 as position FROM USERS WHERE Rating>(SELECT Rating FROM USERS WHERE id='$id')");
$user_pos = (mysql_result($pos_result, 0, "position"));
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@XELAD, Эта твоя логика далека от здравого смысла. Потому как у игроков с ID 68-58 вовсе не обязательно такой рейтинг.
 

XELAD

Новичок
$urs = mysql_query("SELECT Rating FROM USERS WHERE id='$id'");
$urs = mysql_result($urs, 0, "Rating");
$result = mysql_query("(SELECT ID, Rating FROM USERS WHERE Rating>='$urs' ORDER BY Rating ASC LIMIT 11) UNION (SELECT ID, Rating FROM USERS WHERE Rating<'$urs' ORDER BY Rating DESC LIMIT 10)");


Немного сглупил, надо было просто поменять DESC на ASC.
Есть ли возможность оптимизировать данное?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Оптимизировать? Я например понятия не имею как запрос исполняется, есть ли там у тебя нужные индексы и прочее.
 
Сверху