Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> максимальная сумма значений столбца 
:(
    Опции темы
sugee
Дата 25.2.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Допустим у меня есть таблица в которой есть два интересующих меня поля field1 и field2. Значение field2 это целое число. Как вывести в порядке убывания определённое количество field1 с максимальной суммой значений field2?
Вообще, можно ли это сделать только средствами SQL, без дополнительных расчетов в скрипте?

Наверное вопрос сформулирован запутанно. Ну скажем у меня в таблице несколько раз встречается field1="Вася". Надо найти сумму всех field2 которым соответствует field1="Вася" и если эта сумма максимальная то выводим field1 с суммой field2. Потом нужно найти field1 с максимальной суммой field2 среди оставшихся записей и так далее.
Собственно проблема у меня с определением суммы field2 для каждого field1.
Среди агрегатных функций MySQL я не нашёл подходящей.
SUM вычисляет сумму всех значений в столбце, MAX находит максимальное значение в столбце, а мне надо максимальную сумму значений столбца соответствующих определённому значению в другом столбце.

Это сообщение отредактировал(а) sugee - 25.2.2006, 20:49
PM MAIL   Вверх
DeadSoul
Дата 25.2.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Мало что понял из твои объяснений, такое попробуй
Код

SELECT field2,SUM(field1)
FROM myTable
GROUP BY field2
ORDER BY SUM(field1) DESC



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
sugee
Дата 25.2.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Цитата(DeadSoul @ 25.2.2006, 21:09 Найти цитируемый пост)
Мало что понял из твои объяснений
Я пытался изложить в общем виде, получилось запутанно...
В общем, в базу записан лог Apache. Нужно вывести десять хостов с которых был максимальный трафик.
Добавлено @ 21:46
Твой запрос не подходит, потому что
Цитата(sugee @ 25.2.2006, 20:48 Найти цитируемый пост)
SUM вычисляет сумму всех значений в столбце


Это сообщение отредактировал(а) sugee - 25.2.2006, 21:47
PM MAIL   Вверх
DeadSoul
Дата 25.2.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



sugee, структуру БД+запрос который выдает юзер&объем траффик.

Посмотри ключевое слово LIMIT\TOP(Не знаю какое в MySQL существует)


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
sugee
Дата 25.2.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Структура БД
Код

               id   int not null auto_increment primary key,
               host text not null,
               usid text not null,
               us   text not null,
               time int(10) not null,
               req text not null,
               res char(3) not null,
               trafic int not null

Строка файла имеет такой вид:
83.69.119.43 - - [25/Dec/2005:04:12:17 +0300] "GET / HTTP/1.1" 200 17980
Одна запись в таблице - это одна строка файла.
Цитата(DeadSoul @ 25.2.2006, 21:50 Найти цитируемый пост)
запрос который выдает юзер
Юзер ничего не выдаёт, он просто заходит по соответствующей ссылке на страницу где выведена таблица с десятью хостами с наибольшим трафиком и напротив каждого хоста его суумарный трафик. Сложность в том что каждый IP-шник может встречаться в лог-файле сколь угодно раз, значит в базе может быть сколь угодно записей с таким значением поля host. Надо сосчитать суммарный трафик для каждого хоста а затем вывести "десятку лидеров".

А LIMIT он ведь просто ограничивает количество выводимых записей...

PM MAIL   Вверх
DeadSoul
Дата 25.2.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Код

SELECT host,SUM(trafic)
FROM YourTable
WHERE time IN (текущий месяц)
GROUP BY host
ORDER BY 2 DESC 
LIMIT 10

или
Код

SELECT host,SUM(trafic)
FROM YourTable
WHERE time IN (текущий месяц)
GROUP BY host
ORDER BY SUM(trafic)
 DESC LIMIT 10


Пробуй. У меня мускуля нет.

P.S. Подвиг евросети хочешь повторитьsmile


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
sugee
Дата 25.2.2006, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Неа, сочетание host,SUM(trafic) в селекте MySQL вообще не переваривает. А потом как можно сортировать по SUM(trafic), это ведь
сумма всех значений столбца.
PM MAIL   Вверх
DeadSoul
Дата 25.2.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



sugee, а GROUP BY на какой нужон? smile


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
sugee
Дата 26.2.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Код

SELECT `host`,`trafic`
FROM `stat` GROUP BY `host`
 ORDER BY 2 DESC

Вот так выводит вроде 10 хостов с максимальным трафиком, но не суммарным трафиком естественно, а за одно посещение. Ограничение на 10 строк я делаю в скрипте.
ORDER BY SUM(trafic) выдает ошибку "Неправильное юзание функции GROUP"
PM MAIL   Вверх
DeadSoul
Дата 26.2.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Такой сработает:
Код

SELECT host,SUM(trafic)
FROM YourTable
GROUP BY host
ORDER BY 2


И назови свою версию мускула.


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
sugee
Дата 26.2.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



В самом деле, как будто бы работает.
Я сейчас еще немного в своем коде поковыряюсь, приведу кое-что в порядок... Но если действительно правильно, то за мной не заржавеет!
А версия мускула 4.1.
PM MAIL   Вверх
sugee
Дата 26.2.2006, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Вот теперь только одного не пойму, а как мне добраться до суммарного трафика для каждого выбранного хоста?
Ведь SUM(trafic) это весь суммарный трафик, со всех хостов.
PM MAIL   Вверх
Бонифаций
Дата 26.2.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



sum() даст сумму всех значений столбца если нет group by.
При наличиии group by сумма будет считаться для конкретной группы. И это относится к любой аггрегатной функции (sum, count, avg, min,max и тд)


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
sugee
Дата 26.2.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Бонифаций, спасибо, не знал этого.
PM MAIL   Вверх
Me10di0us
Дата 26.2.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.2.2006

Репутация: нет
Всего: нет



В таких случаях я использовал такой запрос
Цитата

SELECT COUNT(trafic) as num, host from YourTable
GROUP BY host ORDER BY num DESC


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.