2015-08-26 9 views
0

Мне нужно показать списки рейтинга для спорта, которым мы управляем.MySQL FROM Подзапрос с родительской группой

Он должен подвести 4 лучших результата для каждого игрока (из таблицы, которая может иметь сотни результатов на игрока), а затем отсортировать весь список от игрока с наибольшим количеством очков до наименьших очков.

Запрос ниже возвращает

ОШИБКА 1054 (42S22): Неизвестный столбец 'r1.user_id' в 'где предложение', так что я ушел от

дорожке где-то.

SELECT r1.user_id, (
    SELECT SUM(points) 
    FROM (
     SELECT * 
     FROM ranking_matrix_points r2 
     WHERE user_id=r1.user_id 
     ORDER BY points DESC 
     LIMIT 4 
    ) r3 
) AS total_points 
FROM ranking_matrix_points r1 
WHERE 
    user.status IN('active') 
GROUP BY r1.user_id 
ORDER BY total_points DESC 
+0

Проблема заключается в том, что MySQL допускает только разрешение на один уровень глубины в коррелированных подзапросах, насколько я знаю. – jpw

ответ

-2

Вам не нужно двойной запрос, просто

SELECT user_id, SUM(points) 
FROM ranking_matrix_points 
WHERE user.status in('active') 
GROUP BY user_id 
ORDER BY total_points DESC 
LIMIT 4 

или

SELECT TOP 4 user_id, SUM(points) 
FROM ranking_matrix_points 
WHERE user.status in('active') 
GROUP BY user_id 
ORDER BY total_points DESC 
+0

Это изменило бы весь смысл запроса и не получило бы желаемого результата, чтобы получить сумму лучших 4 баллов _per user_. Также MySQL не использует 'top' – jpw

+0

Я не вижу пользователя 2 ... этот запрос запрашивает только пользователя и его точки. Либо это, либо что-то плохо написано – zon7

+0

Оба этих SQL-запроса ошибочны. MySQL также не поддерживает TOP. –

0

Одним из возможных решений может быть номер строки для каждого пользователя в порядке пунктов нисходящих и затем суммируйте точки с рангами < = 4. Это может быть не очень хорошо, хотя, и вы столкнетесь с проблемой связей (но у вас тоже будет ограничение).

select user_id, sum(points) total_points 
from (
    select user_id, points, 
    ( 
    case user_id 
    when @cur_user 
    then @row := @row + 1 
    else @row := 1 and @cur_user := user_id end 
) as rank 
    from ranking_matrix_points, 
    (select @row := 0, @cur_user := '') r 
    order by user_id, points desc 
) t 
where rank <= 4 
group by user_id; 

Я уверен, что есть более эффективные способы сделать это, но я не могу придумать ни одного на данный момент. Это было бы очень легко в любой базе данных с поддержкой функций окна, но, к сожалению, MySQL пока не поддерживает.