2013-08-14 3 views
1

Привет пытаются получить записи из таблицы БД в соответствии с самым высоким процентом игры игралвыбрать записи с наибольшим количеством

user_id| game   | CompletePercentage 
---------------------------------- 
1  | name1  | 90 
2  | name2  | 67 
3  | name4  | 100 
4  | name1  | 50 
1  | name4  | 80 
1  | name3  | 70 
1  | name1  | 60 
2  | name2  | 70 
1  | name1  | 50 

Так что, если я хочу, чтобы получить записи для user_id 1 для всех игр но только самый высокий

user_id | game   | highestPercent 
---------------------------------- 
1  | name1  | 90 
1  | name4  | 80 
1  | name3  | 70 

Я пытался

SELECT user_id, game , MAX(CompletePercentage) AS highestPercent 
FROM completedscenarios 
GROUP BY game 
HAVING user_id=1 

но с ограниченным успехом.
Любая помощь приветствуется.

+0

Вы можете использовать 'LIMIT'. – Vucko

ответ

1
SELECT user_id, 
     game, 
     MAX(CompletePercentage) AS highestPercent 
    FROM completedscenarios 
    GROUP BY user_id, game 
    WHERE user_id=1 
2
SELECT user_id, game, CompletePercentage as highestPercentage 
FROM completedscenarios 
WHERE user_id = 1 
ORDER BY CompletePercentage DESC 
LIMIT 3 

Сортировать по проценту, MAX дает только одно максимальное значение. Поскольку для нужного столбца требуется более одного порядка записи и используйте LIMIT для обрезки набора.

+0

спасибо за этот ответ, это было ярчайший однако, он вернулся слишком много повторяющихся записей, потому что можно иметь много записей на 100, то, что работало в конце концов было 'ВЫБРАТЬ user_id, ScenarioName, CompletePercentage AS highestPercentage ОТ completedscenarios WHERE user_id = 1 ** GROUP BY ScenarioName ** ORDER BY CompletePercentage DESC' еще раз спасибо – Roy

+0

привет заговорил, что скоро он не вернет наивысшее число, фактически возвращает наименьшее – Roy

0
SELECT user_id, game,CompletePercentage as highestPercent 
FROM completedscenarios 
WHERE user_id=1 
ORDER BY highestPercent DESC 
Limit 5` 
+0

в качестве побочного примечания. Это может быть идея нормализовать таблицу завершенных сценариев. –

0

Группа по user_id, а затем игру, с максимальным (в процентах)

select user_id, game,max(completepercentage) from @table 
where user_id = 1 
group by user_id,game 

Вы можете добавить заказ, если вам нравится, но выше, дает желаемый результат

+1

Спасибо, это работает и достаточно просто для меня, чтобы понять и реализовать с моим ограниченным знанием SQL – Roy

2

You можете попробовать себя присоединиться, как это fiddle:

Просто, чтобы расширить некоторые другие способы, вы можете использовать это, я обновил оригинальную скрипту до this. Кроме того, я добавил дополнительный datapoint для пользователя 4, чтобы показать, что произошло с дубликатами.

  • Чтобы получить данные для одного пользователя (оригинал запроса):
SELECT c1.* 
FROM completedscenarios c1 
    LEFT JOIN completedscenarios c2 
    ON c1.user_id = c2.user_id 
     AND c1.game = c2.game 
     AND c1.CompletePercentage < c2.completePercentage 
WHERE c1.user_id = 1 and c2.user_id is null; 
  • Чтобы получить всех пользователей и их лучшие результаты в игре
SELECT c1.user_id, c1.game, c1.CompletePercentage 
FROM completedscenarios c1 
    LEFT JOIN completedscenarios c2 ON c1.user_id = c2.user_id 
    AND c1.game = c2.game 
    AND c1.CompletePercentage < c2.completePercentage 
WHERE c2.user_id is null 
ORDER BY c1.user_id, c1.CompletePercentage; 
  • Чтобы получить все игры и самые высокие проценты независимо от того, что Пользователь
SELECT c1.game, c1.user_id, c1.CompletePercentage 
FROM completedscenarios c1 
    LEFT JOIN completedscenarios c2 ON c1.game = c2.game 
    AND c1.CompletePercentage < c2.completePercentage 
WHERE c2.game is null 
ORDER BY c1.game, c1.CompletePercentage; 
  • Чтобы получить пользователей и их наилучшую общую игру
SELECT c1.user_id, c1.game, c1.CompletePercentage 
FROM completedscenarios c1 
    LEFT JOIN completedscenarios c2 ON c1.user_id = c2.user_id 
    AND c1.CompletePercentage < c2.completePercentage 
WHERE c2.user_id is null 
ORDER BY c1.user_id, c1.CompletePercentage; 
  • А вот копия результатов
USER_ID | GAME | COMPLETEPERCENTAGE 
------------------------------------ 
1  | name1 | 90 
1  | name4 | 80 
1  | name3 | 70  
USER_ID | GAME | COMPLETEPERCENTAGE 
------------------------------------ 
1  | name3 | 70 
1  | name4 | 80 
1  | name1 | 90 
2  | name2 | 70 
3  | name4 | 100 
4  | name1 | 50 
4  | name2 | 70 
GAME | USER_ID | COMPLETEPERCENTAGE 
------------------------------------ 
name1 | 1  | 90 
name2 | 2  | 70 
name2 | 4  | 70 
name3 | 1  | 70 
name4 | 3  | 100 
USER_ID | GAME | COMPLETEPERCENTAGE 
------------------------------------ 
1  | name1 | 90 
2  | name2 | 70 
3  | name4 | 100 
4  | name2 | 70 
0

И этот запрос поможет вам получить игру с самым высоким процентом на пользователя

SELECT g.user_id, g.game, g.CompletePercentage FROM 
games g 
INNER JOIN (
SELECT user_id, game, CompletePercentage FROM games 
ORDER BY CompletePercentage DESC 
) j ON g.user_id = j.user_id 
GROUP BY g.user_id 

Это хорошо известный способ делать заказ до группировки.

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