Question

J'ai les tableaux suivants:

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

Collection de l'utilisateur (en e) pour l'
[userid] [game]

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

Jeu de base de données (unique)
[game] [total_scenarios]

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

Tableau de sortie

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

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

  1. Les scénarios appartenant total Grab utilisateur de User Collection jointe à Game Basic Data et COUNT(gbd.total_scenarios)
  2. saisir toutes les pièces enregistrées par COUNT(DISTINCT scenario) pour cet utilisateur
  3. Diviser toutes les pièces enregistrées par le total des scénarios appartenant

Alors que 2 requêtes et est un petit massage de PHP à la fin. Pour une liste des utilisateurs triée par les choses de pourcentage d'achèvement obtenir un peu plus compliqué.

Je me dis que je pourrais saisir Les totaux de collecte de tous les utilisateurs dans une requête, et tous les utilisateurs enregistrés pièces dans un autre, puis faire les CALC et trier le tableau final PHP, mais il semble exagéré d'être potentiellement faire tout cela pour 1000 utilisateurs quand je ne veux jamais le Top 10.

Y at-il une requête de monstre méchant dans MySQL qui pourrait faire tout cela et LIMIT 10? Ou est coller avec PHP gérer la majeure partie du travail la voie à suivre dans ce cas?

Était-ce utile?

La solution

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top