2010-04-12 5 views
1

J'ai les tableaux suivants:Achèvement de la collection Top 10 - une formule monstre in-query dans MySQL?

utilisateur Données de base (unique)
[userid] [name] [etc]

Collection de l'utilisateur (de une à une)
[userid] [game]

utilisateur enregistré est lu (many to many)
[userid] [game] [scenario] [etc]

Données de base du jeu (unique)
[game] [total_scenarios]

Je voudrais produire un tableau qui montre le jeu de collection pourcentage d'achèvement pour les Top 10 utilisateurs dans l'ordre décroissant de%:

sortie Tableau

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

Dans mon esprit, la séquence de calcul pour un utilisateur est:

  1. saisir les scénarios de propriété total utilisateurs de User Collection sont joints à Game Basic Data et COUNT(gbd.total_scenarios)
  2. saisir tous enregistrés par des pièces COUNT(DISTINCT scenario) pour cet utilisateur
  3. Diviser tous les jeux enregistrés par scénarios total appartenant

Voilà 2 requêtes et un petit massage de PHP à la fin. Pour une liste d'utilisateurs triés par pourcentage d'achèvement, les choses deviennent un peu plus compliquées.

Je me dis que je pouvais saisir toutes la collection des utilisateurs totaux dans une requête, et tous les utilisateurs enregistrés joue dans un autre, puis faire les CALC et trier le tableau final PHP, mais il semble exagéré potentiellement faire tout cela pour plus de 1000 utilisateurs quand je ne veux que le Top 10.

Y at-il une requête monstre méchant dans MySQL qui pourrait faire tout cela et LIMIT 10? Ou reste-t-il avec PHP qui gère la plus grande partie du travail dans ce cas?

+1

Vous pouvez stocker le pourcentage ailleurs (par exemple une autre table) et le mettre à jour lorsque vous apportez des modifications à 'l'utilisateur enregistré Plays'. Ensuite, ce serait un simple JOIN ... ORDER BY pourcentage. Est-ce faisable dans votre scénario? – VolkerK

Répondre

2

Si je comprends ce que vous avez besoin correctement, vous pouvez essayer quelque chose comme

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