web-dev-qa-db-fra.com

MySQL COUNT avec LIMIT

Ce que je veux faire, c'est SUM une colonne, mais aussi COUNT le nombre de lignes qu'elle additionne, avec une limite de pas plus de 5 lignes. Donc ma requête est:

SELECT COUNT(*), SUM(score) FROM answers WHERE user=1 LIMIT 5

Ce que j'attendais en retour était un COUNT (*) jusqu'à 5 (je ne peux pas supposer que ce sera toujours 5 dans ma logique de code car il pourrait avoir moins de 5 réponses), avec une somme du score de la jusqu'à 5 lignes.

Au lieu de cela, je semble récupérer le nombre total de lignes correspondantes (où l'utilisateur est 1) comme nombre et la somme du score de ces lignes. Les chiffres ne changent pas si je mets LIMIT 1 ou LIMIT 5 ou même LIMIT 50.

Je pense que cela fonctionnera dans cette situation

SELECT COUNT(*), SUM(score) FROM (SELECT * FROM answers WHERE user=1 LIMIT 5) AS a

Mais cela semble un peu compliqué pour une requête aussi simple, et comme c'est dans un script à fort trafic, je veux que ce soit aussi performant que possible.

Suis-je en train de manquer quelque chose? J'ai trouvé ce rapport de bogue il y a quelques années, ce qui semble être lié à ce "problème", mais je suppose que ce n'est pas vraiment un bogue?

41
Lee

C'est en fait ainsi que fonctionne votre requête et c'est un comportement normal. En utilisant LIMIT vous ne limiterez pas le nombre ou la somme mais seulement les lignes retournées. Votre requête renverra donc n lignes comme indiqué dans votre clause LIMIT. Et puisque votre requête ne renvoie en fait qu'une seule ligne, l'application d'une limite (non nulle) n'a aucun effet sur les résultats.

Cependant, votre deuxième requête fonctionnera comme prévu et est un moyen établi de résoudre ce problème.

44
Fabio