2009-10-16 9 views
3

J'étais sur le point de demander la liste MySql et je me suis souvenu de SO.Obtention d'un pourcentage de MySql avec un groupe par condition, et précision

En cours d'exécution MySql 5.0.85, je dois être aussi efficace que possible sur quelques requêtes. Si je pouvais avoir une petite critique, j'apprécierais.

Je recueille des données dans les millions, et j'ai besoin des 50 premiers groupés par un champ, avec un pourcentage de combien ces 50 premiers occupent.

Voici ce que je suis venu avec ... 1) Je sens que je peux être plus efficace, peut-être avec une jointure 2) Comment puis-je obtenir le pourcentage d'être de précision dans les centièmes, donc * 100,00 à savoir: .07 devient 7,00, obtenez des erreurs SQL si je (pourcentage * 100)

SELECT user_agent_parsed, user_agent_original, COUNT(user_agent_parsed) AS thecount, 
    COUNT(*)/(SELECT COUNT(*) FROM agents) AS percentage 
FROM agents 
GROUP BY user_agent_parsed 
ORDER BY thecount DESC LIMIT 50; 

question en second lieu, une fois par jour, je dois archiver le résultat de ce qui précède. Des suggestions sur la meilleure façon de faire cela? Je peux programmer avec cron, ou dans mon cas, launchd, sauf si quelqu'un a une meilleure suggestion.

Pensez-vous qu'un simple 'SELECT (ci-dessus) INTO foo' suffirait?

+0

Deuxième question: dont vous avez besoin du temps/date dans les archives? – lexu

+0

Désolé, oui, j'ai un horodatage de ajouté et mis à jour, ne l'a pas montré dans l'exemple. Je vais porter un identifiant unique ainsi – user170579

Répondre

8

Première question:

select count(*) from agents into @AgentCount; 

SELECT user_agent_parsed 
    , user_agent_original 
    , COUNT(user_agent_parsed) AS thecount 
    , COUNT(*)/(@AgentCount) AS percentage 
FROM agents 
GROUP BY user_agent_parsed 
ORDER BY thecount DESC LIMIT 50; 
+0

Comment est-ce un plus performant? Encore deux requêtes, vous pouvez même le ralentir car vous stockez littéralement une variable. millisecondes, mais pouvez-vous élaborer? – user170579

+0

Votre requête imbriquée est potentiellement exécutée une fois par élément groupé. La mienne court une fois. Accordé, cela pourrait être attrapé par l'optimiseur .. – lexu

+0

Ah, merci. Je cours expliquer et voir. – user170579

0

Je ne comprends pas complètement votre question, alors je vais d'abord répondre à votre question sur la façon d'obtenir le pourcentage. Et je vais utiliser votre requête actuelle.

SELECT user_agent_parsed, user_agent_original, COUNT(user_agent_parsed) AS thecount, 
    ((COUNT(*)/(SELECT COUNT(*) FROM agents)) * 100) AS percentage 
FROM agents 
GROUP BY user_agent_parsed 
ORDER BY thecount DESC LIMIT 50; 

Pour moi de vous aider, je pense que je dois vous développiez davantage ;-)

+0

paren Misplaced, Merci !. Le deuxième problème est que je vais prendre le résultat de la requête ci-dessus, et que je veux enregistrer l'état des résultats dans le temps. Je stocke des hits dans un journal d'agent utilisateur, donc je peux trouver que Safari est de 100 utilisations par jour, IE est de 65 utilisations par jour, etc (simplifié). Cela change bien sûr de jour en jour et je veux tracer la croissance/baisse sur une année. J'ai besoin de stocker le résultat de la requête ci-dessus, pour les statistiques à long terme. J'envisage de sélectionner le résultat dans une nouvelle table, à moins que ce ne soit une mauvaise idée et qu'il y en ait une plus élégante, – user170579