2009-08-21 6 views
20

J'ai une table: "nom d'ID c_counts f_counts"Comment ORDER BY un SUM() en MySQL?

et je veux commander tout le dossier par sum(c_counts+f_counts) mais cela ne fonctionne pas:

SELECT * FROM table ORDER BY sum(c_counts+f_counts) LIMIT 20;

Répondre

46

Don'y oublier que si Si vous mélangez des champs groupés (c'est-à-dire SUM) et des champs non groupés, vous devez GROUP BY l'un des champs non groupés.

Essayez ceci:

SELECT SUM(something) AS fieldname 
FROM tablename 
ORDER BY fieldname 

OU ceci:

SELECT Field1, SUM(something) AS Field2 
FROM tablename 
GROUP BY Field1 
ORDER BY Field2 

Et vous pouvez toujours faire une requête dérivée comme ceci:

SELECT 
    f1, f2 
FROM 
    (
     SELECT SUM(x+y) as f1, foo as F2 
     FROM tablename 
     GROUP BY f2 
    ) as table1 
ORDER BY 
    f1 

De nombreuses possibilités!

+0

oui, je veux pour tous les dossiers par la somme de certains champs. cela fonctionne: SELECT somme (c_counts + f_counts) FROM table GROUP BY nom LIMIET 20; merci! – lovespring

+0

Vous mon ami m'a juste rendu la vie beaucoup plus facile! Je me suis battu avec une requête similaire depuis des lustres et je n'arrivais pas à bien faire les choses - vous venez de sauver mon bacon! Merci beaucoup! –

+0

vous pouvez également sélectionner champ1, somme (champ) de l'ordre de table par 2 (où 2 signifie essentiellement le deuxième champ), il est pratique en utilisation interactive, mais je ne le recommanderais pas pour le code réel. –

7

Voici comment vous le faites

SELECT ID,NAME, (C_COUNTS+F_COUNTS) AS SUM_COUNTS 
FROM TABLE 
ORDER BY SUM_COUNTS LIMIT 20 

La fonction SOMME ajoutera toutes les lignes, de sorte que la clause order by ne sert à rien, au contraire, vous devrez utiliser la clause group by.

+0

cela fonctionnera en effet pour trier par la somme de ces deux champs. Je lisais "sum" comme la fonction agrégée "sum", mais je pense que vous avez l'interprétation correcte ici. – user158017

0

Sans une clause GROUP BY, toute sommation fera rouler toutes les lignes dans une seule ligne, de sorte que votre requête ne fonctionnera en effet pas. Si vous avez groupé par, disons, nom et ordre par somme (c_counts + f_counts), alors vous pourriez obtenir des résultats utiles. Mais vous devrez regrouper par quelque chose.

0

Le problème que je vois ici est que "sum" est une fonction d'agrégat. D'abord, vous devez corriger la requête elle-même.

Select sum(c_counts + f_counts) total, [column to group sums by] 
from table 
group by [column to group sums by] 

alors, vous pouvez trier:

Select * 
from (query above) a 
order by total 

EDIT: Mais voir après par Virat. Peut-être que ce que vous voulez n'est pas la somme de vos champs totaux sur un groupe, mais juste la somme de ces champs pour chaque enregistrement. Dans ce cas, Virat a la bonne solution.

+0

La sous-requête est inutile - il suffit d'ajouter un 'ORDER BY' à la première requête. Dans cet exemple: 'ORDER BY total' ou' ORDER BY total DESC'. Si vous avez besoin d'une "LIMIT" aussi, alors ça va après. –

3

Vous pouvez essayer ceci:

SELECT * 
FROM table 
ORDER BY (c_counts+f_counts) 
LIMIT 20