2010-12-11 5 views
10

Ce:Comment puis-je obtenir la longueur moyenne de la chaîne dans mysql?

SELECT AVG(LENGTH(string)) 
    FROM BLAH 
LIMIT 10; 

... semble moudre à travers tous les résultats. Si je retire l'AVG, c'est beaucoup plus rapide. Est-il préférable de créer une sous-requête comme

SELECT AVG(len) 
    FROM (SELECT LENGTH(string) as len 
      FROM BLAH 
     LIMIT 10) as herp 

Cela semble également lent. Je ne veux pas tout charger en boucle php avec strlen. J'espérais qu'il y avait une solution efficace en mémoire.

+0

Quelle est la lenteur de la sous-requête? –

+0

Pouvez-vous nous montrer comment vous vous limitez réellement aux derniers messages X d'un auteur, et pouvez-vous nous dire pourquoi vous détestez les sous-requêtes? – pilcrow

+0

Je veux prendre une moyenne des 2 premières entrées de la liste [1,2,3,4]. Une sous-requête prend le sous-ensemble [1,2] puis utilise la fonction avg(). Il est préférable d'ajouter à un accumulateur puis de diviser, plutôt que d'avoir un ensemble de longueur arbitraire chargé en mémoire. Comme d'autres l'ont fait remarquer, c'est juste un ordre d'id desc, mais en réalité cette partie n'est pas si significative. – ForeverConfused

Répondre

6

la première requête boucles à travers toutes les lignes de la table (la limite de 10 doest limiter quoi que ce soit, car il y aura toujours seulement 1 ligne renvoyée)

la seconde des lignes de avg requête 1 à 10

ce type de moyenne que vous cherchez?

+0

Récupération de la longueur moyenne d'une publication dans un forum d'auteurs pour les dernières entrées X effectuées. Je déteste utiliser des sous-requêtes, alors j'espérais qu'il y aurait un meilleur moyen. – ForeverConfused

+0

@ForeverConfused nop il n'y en a pas, vous pouvez utiliser un ordre de DESC dans la sous-requête pour les 10 dernières –

+0

C'est une moyenne donc techniquement il pourrait juste s'ajouter à un compteur puis diviser par le nombre d'entrées qu'il a frappé. La manière de sous-requête que je montre passe par les éléments deux fois. – ForeverConfused