2010-01-12 3 views
2

У меня есть таблица хранения транзакционных данных для пользователей. Чтобы найти рейтинг пользователей, вы берете средний балл за последние 10 записей для этого пользователя. Есть ли способ получить это с помощью SQL?MySQL: последние 10 записей на пользователя?

Мне нужно уметь работать для одного пользователя с учетом их идентификатора. И получить список всех пользователей, заказанных по их счету.

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

# returns average for all transactions. 
SELECT user_id, AVG(score) FROM transactions WHERE user_id = 1 
# returns scores for last 10 transactions. 
SELECT user_id, score FROM transactions WHERE user_id = 1 ORDER_BY date DESC LIMIT 10 
+0

Какую версию MySQL вы используете? –

+0

Ver 14.12 Распространение 5.0.45 – Jake

ответ

2

Использование:

SELECT x.user_id, 
     AVG(x.score) 
    FROM (SELECT t.user_id, 
       t.score 
      FROM TRANSACTIONS t 
      WHERE t.user_id = ? 
     ORDER BY t.date 
      LIMIT 10) x 
GROUP BY x.user_id 
+0

Успех! Таким образом, вы выбираете из подзапроса вместо таблицы. Я постараюсь выяснить, как получить баллы для всех игроков, я думаю, что все, что нужно, задать отдельный вопрос об этом, если понадобится. – Jake

+0

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

1

Просто объединить два запроса уже используется:

SELECT user_id, AVG(score) 
FROM transactions 
WHERE rowid in (
    SELECT rowid 
    FROM transactions 
    WHERE user_id = 1 
    ORDER_BY date DESC 
    LIMIT 10) 

где rowid является то, что идентифицирующая И.Д. является.

+0

Спасибо, выглядит многообещающе, но ... # 1235 - Эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery» Возможно, мне придется обновить, если смогу найти лучший способ. – Jake