2010-04-12 2 views
1

У меня есть следующие таблицы:Топ-10 завершений коллекции - формула монстра в запросе в MySQL?

пользователя Основные данные (уникальный)
[userid] [name] [etc]

Коллекция пользователя (12:59)
[userid] [game]

Пользователь записи Пьесы (многие ко многим)
[userid] [game] [scenario] [etc]

Основная информация об игре (уникальная)
[game] [total_scenarios]

Я хотел бы выводить таблицу, которая показывает процент завершения сбора игры для Top 10 пользователей в порядке% убывания:

выход Таблица

[userid] [collection_completion] 
    3    95% 
    1    81% 
    24    68% 
    etc    etc 

В мой взгляд, последовательность расчета для одного пользователя составляет: всего принадлежит

  1. захватить пользователя сценарии из User Collection вместе с Game Basic Data и COUNT(gbd.total_scenarios)
  2. захватить все записанные пьесы COUNT(DISTINCT scenario) для этого пользователя
  3. Разделить все записанные пьесы общего принадлежат сценарии

Так что это 2 запросы и немного массаж PHP в конце. Для списка пользователей, отсортированных по процентам завершения, все становится немного сложнее.

Я полагаю, что я мог бы захватить коллекцию всех пользователей составляет в одном запросе, и все пользователи записали играет в другой, а затем сделать Calcs и сортировать окончательный массив в PHP, но это кажется излишним потенциально делать все, что для 1000+ пользователей, когда я только когда-либо хочу Top 10.

Есть ли в MySQL беспорядочный запрос на монстр, который мог бы все это сделать и LIMIT 10? Или придерживается того, что PHP обрабатывает основную часть работы в этом случае?

+1

Вы можете хранить процент в другом месте (например, в другой таблице) и обновлять его при внесении изменений в 'User Записано Plays'. Тогда это будет простой JOIN ... ORDER BY. Возможно ли это в вашем сценарии? – VolkerK

ответ

2

Если я понимаю, что вам нужно правильно, вы можете попробовать что-то вроде

SELECT userid, 
     us.TotalUserscenario/gbd.total_scenarios collection_completion 
FROM (
      SELECT userid, 
        game, 
        COUNT(scenario) TotalUserscenario 
      FROM UserRecordedPlays urp 
      GROUP BY userid, 
         game 
     ) UserScenarios us INNER JOIN 
     GameBasicData gbd ON us.game = gbd.game 
ORDER BY collection_completion DESC 
LIMIT 10