Как ЗАКАЗАТЬ ПО СУММЕ () в MySQL?

У меня есть таблица: "ID name c_counts f_counts"

и я хочу упорядочить всю запись по sum(c_counts+f_counts), но это не работает:

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


person lovespring    schedule 21.08.2009    source источник


Ответы (5)


Не забывайте, что если вы смешиваете сгруппированные (например, СУММ) поля и несгруппированные поля, вам необходимо СГРУППИРОВАТЬ ПО одному из несгруппированных полей.

Попробуй это:

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

Много возможностей!

person gahooa    schedule 21.08.2009
comment
да, я хочу упорядочить все записи по сумме некоторых полей. это работает: SELECT sum(c_counts+f_counts) FROM table GROUP BY name LIMIET 20; спасибо! - person lovespring; 21.08.2009
comment
Ты мой друг только что сделал мою жизнь чертовски легче! Долго мучался с подобным запросом и не мог понять его правильно - вы только что спасли мой бекон! Большое спасибо! - person Chris Edwards; 02.12.2014
comment
вы также можете выбрать поле1, сумму (поле) из таблицы с порядком 2 (где 2 означает в основном второе поле), это удобно в интерактивном использовании, но я бы не рекомендовал его для реального кода. - person Felipe Valdes; 06.03.2018

Вот как ты это делаешь

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

Функция SUM суммирует все строки, поэтому предложение order by бесполезно, вместо этого вам придется использовать предложение group by.

person Virat Kadaru    schedule 21.08.2009
comment
это действительно будет работать для сортировки по сумме этих двух полей. Я читал sum как сумму агрегатной функции, но я думаю, что у вас здесь правильная интерпретация. - person user158017; 21.08.2009

Вы можете попробовать это:

SELECT * 
FROM table 
ORDER BY (c_counts+f_counts) 
LIMIT 20
person DarkAjax    schedule 29.08.2012
comment
Очень полезно, когда у нас есть функция getBy(order), которая вызывает SQL, мы можем сделать что-то вроде этого: getBy("(c_counts+f_counts)") - person Stéphane Bruckert; 01.03.2021

Без предложения GROUP BY любое суммирование сведет все строки в одну строку, поэтому ваш запрос действительно не будет работать. Если вы сгруппировали, скажем, по имени и упорядочили по сумме (c_counts+f_counts), вы можете получить некоторые полезные результаты. Но вам придется сгруппировать по чему-то.

person jrista    schedule 21.08.2009

Проблема, которую я вижу здесь, заключается в том, что «сумма» является агрегатной функцией.

во-первых, вам нужно исправить сам запрос.

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

РЕДАКТИРОВАТЬ: Но см. сообщение Вирата. Возможно, вам нужна не сумма ваших общих полей по группе, а просто сумма этих полей для каждой записи. В этом случае у Вирата есть правильное решение.

person user158017    schedule 21.08.2009
comment
Подзапрос не нужен — просто добавьте ORDER BY к первому запросу. В этом примере: ORDER BY total или ORDER BY total DESC. Если вам нужен еще и LIMIT, то он идет потом. - person Rick James; 30.04.2017