web-dev-qa-db-ja.com

MySQLでSUM()を並べ替えるには?

テーブルがあります:「ID名c_counts f_counts」

すべてのレコードをsum(c_counts+f_counts)で並べたいのですが、これは機能しません:

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

29
lovespring

グループ化された(つまり、SUM)フィールドと非グループ化フィールドを混在させる場合、非グループ化フィールドの1つをグループ化する必要があることを忘れないでください。

これを試して:

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

またはこれ:

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

そして、次のような派生クエリをいつでも実行できます。

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

多くの可能性!

64
gahooa

これがあなたのやり方です

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

SUM関数はすべての行を加算するため、order by句は役に立たず、代わりにgroup by句を使用する必要があります。

8
Virat Kadaru

これを試すことができます:

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

GROUP BY句がないと、すべての合計がすべての行を1つの行にロールアップするため、クエリは実際には機能しません。たとえば、名前でグループ化し、sum(c_counts + f_counts)で順序付けした場合、いくつかの有用な結果が得られる可能性があります。ただし、何かでグループ化する必要があります。

0
jrista

ここで見た問題は、「sum」が集約関数だということです。

最初に、クエリ自体を修正する必要があります。

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

次に、それをソートできます。

Select *
from (query above) a
order by total

編集:しかし、Viratによる投稿を参照してください。おそらくあなたが望むのは、グループ全体のフィールドの合計ではなく、各レコードのフィールドの合計だけです。その場合、Viratには適切なソリューションがあります。

0
user158017