2013-09-13 2 views
1

Я не уверены, что если этот вопрос не запрошен, но я не знаю, как слово лучше :)PDO Возврат высокое целое значение и не повторяющиеся записи

У меня есть таблица с результатами игр. Мне нужно вернуть 10 лучших результатов (для лидеров), но мои результаты должны вернуть самую высокую игру за игрока и не реплицировать игрока (так что я ищу наивысший балл каждого игрока и на основании того, что 10 лучших игроков, а не сказать если я первый и третий на баллы, чтобы показать мне дважды).

SQL, я использую в данный момент:

SELECT 
     `games`.`score`, 
     CONCAT(`users`.`full_name`) AS `name`, 
     `users`.`facebook_id` 
     FROM 
     `games`, 
     `users` 
     WHERE 
     `games`.`user_id`=`users`.`id` 
     AND `users`.`id` IN ('user ids goes here') 
     AND `games`.`status`=2 
     ORDER BY 
     `games`.`score` DESC 
     LIMIT 10"; 

Может ли это быть сделано с помощью одного запроса или было бы лучше работать на возвращаемом массиве и создать мои желаемые результаты оттуда?

UPDATE:

Чтобы лучше проиллюстрировать, что мы имеем следующие результаты:

Jack - 300 points 
Jill - 280 points 
Gareth - 250 points 
Jack - 240 points (this is the same jack) 
Peter - 230 points 
.... 

я хочу вернуться из всех игр, топ 10 игроков, основываясь на их наибольшее количество очков, так не neccesarily 10 результатов, но я ищу результат, который будет затем возвращать следующее:

Jack - 300 points 
Jill - 280 points 
Gareth - 250 points 
Peter - 230 points 

Так 2-й Джек удален, потому что он уже включен в список только с более высоким счетом.

Я надеюсь, что это помогает :)

+0

Я не понимаю ваш вопрос; есть ли у вас небольшой пример данных и ожидаемого результата? –

+0

Что-то с 'GROUP BY users.id' и' MAX (games.score) '? Возможно, в зависимости от вашего сервера базы данных. – CD001

+0

... на самом деле -^это не сработает, так как это будет ** только ** вернуть лучший результат, а не топ 10. Может понадобиться суб-запрос, но он эффективно действует как другой запрос к базе данных, так что, если вы «Собираюсь построить хранимую процедуру, накладные расходы, вероятно, меньше, чтобы просто извлекать результаты из базы данных и сортировать ее в приложении. – CD001

ответ

0

Хорошо, давайте сделаем это шаг за шагом.

С этим запросом мы получим список игр и их игроков, отсортированные по игре и оценке. Мы добавляем рулон, который сбрасывается до 1 для каждой игры.

SELECT 
games.game_id, 
`games`.`score`, 
CONCAT(`users`.`full_name`) AS `name`, 
`users`.`facebook_id`, 
@row_num := if(@game != games.game_id, 1, @row_num + 1) AS rownumber, 
@game := games.game_id 
FROM 
`games` 
INNER JOIN users ON `games`.`user_id`=`users`.`id` 
, (select @row_num := 1, @game := NULL) variables 
WHERE 
`users`.`id` IN ('user ids goes here') 
AND `games`.`status`=2 
ORDER BY 
games.game_id, /*or something*/ 
`games`.`score` DESC 

Теперь мы можем получить 10 лучших игроков для каждой игры, поставив выше запроса в этот

SELECT * FROM (
<above query here> 
) subquery_alias 
WHERE rownumber <= 10; 

Теперь мы просто должны добавить GROUP BY Playername и получить наибольший результат. Таким образом, ваш окончательный запрос таков:

SELECT name, MAX(score) FROM (
SELECT 
games.game_id, 
`games`.`score`, 
CONCAT(`users`.`full_name`) AS `name`, 
`users`.`facebook_id`, 
@row_num := if(@game != games.game_id, 1, @row_num + 1) AS rownumber, 
@game := games.game_id 
FROM 
`games` 
INNER JOIN users ON `games`.`user_id`=`users`.`id` 
, (select @row_num := 1, @game := NULL) variables 
WHERE 
`users`.`id` IN ('user ids goes here') 
AND `games`.`status`=2 
ORDER BY 
games.game_id, /*or something*/ 
`games`.`score` DESC 
) subquery_alias 
WHERE rownumber <= 10 
GROUP BY `name` 
+0

@MauritzSwanepoel Обратная связь была бы приятной ... – fancyPants

0

Я думаю, что вам нужно, это следующий запрос:

SELECT 
    MAX(`games`.`score`), 
    CONCAT(`users`.`full_name`) AS `name`, 
    `users`.`facebook_id` 
FROM 
    `games` 
JOIN `users` 
    ON `games`.`user_id` = `users`.`id` 
WHERE `users`.`id` IN ('user ids goes here') 
    AND `games`.`status`=2 
GROUP BY `name` 
ORDER BY `games`.`score` DESC 
LIMIT 10"; 

Только с помощью простого MAX(games.score) будет делать трюк вместе с группировкой результата вместе.

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

  • Нет связанных вопросов^_^