2009-11-19 2 views
4

Я пытаюсь получить MAX в столбце, который генерируется динамически с использованием инструкции SUM. Оператор SUM используется вместе с синтаксисом «GROUP by».MAX на столбцах, сгенерированных SUM и GROUP BY

Это оригинальный запрос, однако его необходимо изменить для работы с группировкой, суммой и, конечно, MAX.

SELECT SUM(video_plays) AS total_video_plays 
    FROM `video_statistics` v_stat 
    GROUP BY v_stat.`video_id` ASC 

Как вы можете видеть, SUM добавляет все значения внутри video_plays в total_video_plays ..

Но я просто хочу, чтобы получить MAX из total_video_plays

Мои попытки ниже, однако они не работают.

SELECT SUM(video_plays) AS MAX(total_video_plays) 
    FROM `video_statistics` v_stat 
    GROUP BY v_stat.`video_id` ASC 

Как бы вы получите MAX на колонке из динамически без использования подзапросов - Поскольку выше уже размещен в одном.

ответ

10

Что-то вроде

SELECT SUM(video_plays) AS total_video_plays 
FROM `video_statistics` v_stat 
GROUP BY v_stat.`video_id` 
ORDER BY total_video_plays DESC 
LIMIT 1 

Hat Tip OMG Ponies для надлежащего диалекта MySQL.

+0

Спасибо, так как у меня есть SQL, о котором идет речь примерно в 5 раз. Я думаю, что я прошел мимо линии «плохой практики». Вот почему Im пытается удержать субмарины до минимального. Это делает трюк. Еще раз спасибо! Ларри. – BeaversAreDamned

+0

Этот запрос не выполняется в сценариях, когда в результате есть более одного максимального значения. – gkiko

+0

Почему? Пользователь не запрашивал количество раз, когда максимальное воспроизведение видео существует, только то, что максимальное число, которое будет возвращено этому запросу. –

0

вы не можете просто сделать это ?:

SELECT video_id, max(video_plays) AS max_video_plays  
FROM `video_statistics` v_stat  
GROUP BY v_stat.`video_id` ASC 

Там пример здесь:

http://dev.mysql.com/doc/refman/5.1/de/select.html

SELECT user, MAX(salary) FROM users 
GROUP BY user HAVING MAX(salary) > 10; 

EDIT: вторая попытка, хотя и с использованием подзапроса:

select max(sum_video_plays) 
from (
SELECT video_id, sum(video_plays) AS sum_video_plays  
FROM `video_statistics` v_stat  
GROUP BY v_stat.`video_id` 
) x 

Ваш внешний запрос может быть выбран из гораздо меньшего набора, и (в зависимости от вашего распределения данных и т. Д.) Может быть весьма эффективным.

+0

Первый запрос даст вам самую высокую единую запись, а не самую высокую сумму. –

+0

@Dave: не стоит беспокоиться, возможно, что MySQL 'GROUP BY' будет работать, но это расстраивает, потому что синтаксис не поддерживается какой-либо другой БД, о которой я знаю. –

3

Вы не можете делать то, что вы просите, без подзапроса, потому что вы не можете запускать две совокупные функции, одну поверх другой.

+0

Будет ли это иметь существенное влияние на производительность? Iv чтение подзапросов может привести к потере ваших ресурсов Как же, если бы я сделал это с помощью подзапроса? – BeaversAreDamned

+0

+1 за непонимание вопроса, как и я! – davek

+1

@Beavers: подзапросы MySQL не работают хорошо, но это не относится ко всем базам данных. –

2

Будет ли это работать на вас?

SELECT MAX(total_video_plays) from table (
SELECT SUM(video_plays) AS total_video_plays 
    FROM `video_statistics` v_stat 
    GROUP BY v_stat.`video_id` ASC) 

Он содержит подзапрос, но, возможно, не в том смысле, о котором вы думали.

+0

Я не думаю, что это сработало бы как есть - я сделал это только как FROM (SELECT ... ', но это единственный способ сделать это, используя две совокупные функции. –

+0

Спасибо за вашу попытку! , – BeaversAreDamned