2010-07-23 2 views
1

У меня есть веб-сайт, который собирает высокие баллы за игру - боковая панель показывает последние 10 баллов (не обязательно самые высокие, только последние 10). Однако, поскольку пользователь может быстро играть в несколько игр, они могут доминировать в последних 10 списках. Как я могу написать SQL-squery, чтобы показать последние 10 баллов, но ограничить его одним пользователем?SQL - один результат на запись пользователя

+1

Какая база данных? – CJM

+0

, если пользователь играет в 5 игр, добавляется ли оценка всех 5 игр вместе или вы берете только самый высокий балл? –

ответ

7
SELECT username, max(score) 
FROM Sometable 
GROUP BY username 
ORDER BY Max(score) DESC 

и из этого выберите верхний X в зависимости от вашей платформы db. выбрать верхнюю (10) в MS-SQL 2005+

редактировать

извините, я вижу, что вы хотите вещи упорядоченные по дате.

Вот рабочий запрос с MS-SQL 2005.

; 
WITH CTE AS 
(
SELECT ROW_NUMBER() OVER (PARTITION BY username ORDER BY dateadded DESC) AS 'RowNo', 
username, score, dateadded FROM SomeTable 
) 
SELECT username, score, dateadded FROM CTE 
WHERE RowNo = 1 
+1

Плакат хочет получить последние 10 баллов, т. Е. Последний балл от каждого из 10 пользователей, а не самый высокий. Не имеет смысла заказать по результату или показать MAX (оценка). –

+0

Отличный ответ, это то, что мне нужно –

0

Группа пользователем ... и либо выберите Max (Score), Макс ([Подача Дата]) или любой другой.

0

В SQL Server вы можете использовать RANK() OVER() с соответствующими PARTITION и GROUP BY, но какую платформу вы используете?

0

В интересах обеспечения другой точки зрения, вы можете просто добавить поле «Макс оценки» к столу пользователя, а затем использовать простой запрос с заказом на, чтобы получить верхнюю 10.

Вашего обновления будешь нужно проверить, если новый счет, если выше, чем текущий максимальный балл.

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

В любом случае, еще один вариант рассмотрения.

0

Вот рабочий пример, который я построил на SQL Server 2008

WITH MyTable AS 
(
    SELECT 1 as UserId, 10 as Score UNION ALL 
    SELECT 1 as UserId, 11 as Score UNION ALL 
    SELECT 1 as UserId, 12 as Score UNION ALL 
    SELECT 2 as UserId, 13 as Score UNION ALL 
    SELECT 2 as UserId, 14 as Score UNION ALL 
    SELECT 3 as UserId, 15 as Score UNION ALL 
    SELECT 3 as UserId, 16 as Score UNION ALL 
    SELECT 3 as UserId, 17 as Score UNION ALL 
    SELECT 4 as UserId, 18 as Score UNION ALL 
    SELECT 4 as UserId, 19 as Score UNION ALL 
    SELECT 5 as UserId, 20 as Score UNION ALL 
    SELECT 6 as UserId, 21 as Score UNION ALL 
    SELECT 7 as UserId, 22 as Score UNION ALL 
    SELECT 7 as UserId, 23 as Score UNION ALL 
    SELECT 7 as UserId, 24 as Score UNION ALL 
    SELECT 8 as UserId, 25 as Score UNION ALL 
    SELECT 8 as UserId, 26 as Score UNION ALL 
    SELECT 9 as UserId, 26 as Score UNION ALL 
    SELECT 10 as UserId, 20 as Score 
), 
MyTableNew AS 
(
    SELECT Row_Number() OVER (Order By UserId) Sequence, * 
    FROM MyTable 
), 
RankedUsers AS 
(
    SELECT *, Row_Number() OVER (Partition By UserId ORDER BY Sequence DESC) Ranks 
    FROM MyTableNew 
) 
SELECT * 
FROM MyTableNew 
WHERE Sequence IN 
(
    SELECT TOP 5 Sequence 
    FROM RankedUsers 
    WHERE Ranks = 1 
    ORDER BY Sequence DESC 
) 
0
SELECT s2.* 

FROM 
(SELECT user_id, MAX(action_time) AS max_time 
FROM scores s1 GROUP_BY user_id 
ORDER BY MAX(action_time) DESC LIMIT 10)s1 
INNER JOIN scores s2 ON (s2.user_id = s1.user_id AND s2.action_time = s1.max_time)   

Это синтаксис Mysql, для сервера SQL вы должны использовать SELECT TOP 10 ... вместо LIMIT 10.

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