Top 10 fin de collection - un monstre formule en requête dans MySQL?
-
26-09-2019 - |
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:
- Les scénarios appartenant total Grab utilisateur de
User Collection
jointe àGame Basic Data
etCOUNT(gbd.total_scenarios)
- saisir toutes les pièces enregistrées par
COUNT(DISTINCT scenario)
pour cet utilisateur - 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?
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