Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

mysql, sum и незнание...

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных
Предыдущая тема :: Следующая тема  
Автор Сообщение
suwayyah



Зарегистрирован: 24.04.2007
Сообщения: 5

СообщениеДобавлено: Вт Апр 24 2007 12:41    Заголовок сообщения: mysql, sum и незнание... Ответить с цитатой

В общем задача такая:
есть таблица tbl-

id - int(11) auto_increment
chis1 - int(11)
itogo - int(11)

Вопрос: возможно ли средствами MySql автоматически заполнять поле ITOGO
суммой поля CHIS1 до текущей строки включительно.

Пробовал тупо присваивать значения типа
UPDATE tbl SET itogo=SUM(chis1) WHERE id<=id или
UPDATE tbl SET itogo=SUM(chis1) WHERE id<=count(id)
но как оказалось такое счастье не прокатит Shocked
_________________
и это тоже пройдёт...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Апр 24 2007 16:05    Заголовок сообщения: Не надо стараться заставить машину думать по-человечески Ответить с цитатой

Такое:
Код:
UPDATE tbl SET itogo=(SELECT SUM(sub.chis1) FROM tbl AS sub WHERE sub.id<=tbl.id)
подойдёт?
А вот ещё вариант:
Код:
UPDATE A SET itogo = B.sum_chis1 FROM tbl AS A INNER JOIN (SELECT sup.id, SUM (sub.chis1) AS sum_chis1 FROM tbl AS sup INNER JOIN tbl AS sub ON sup.id>=sub.id GROUP BY sup.id) AS B on A.id = B.id

Но не уверен, что второй вариант действует в MySQL
------------------------------------
Не надо стараться заставить машину думать по-человечески
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
suwayyah



Зарегистрирован: 24.04.2007
Сообщения: 5

СообщениеДобавлено: Ср Апр 25 2007 07:07    Заголовок сообщения: Ответить с цитатой

В общем и так и так пробовал выдаёт следующую ошибку:

Код:

#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT SUM(sub.chis1) FROM tbl AS sub WHERE sub.id<=tbl.id'


У меня в принципе тоже самое выдавал, т.е. во время присваивания переменной значения выборки (SELECT) он выдаёт ошибку, если же просто присваивать определенные значения , то всё пучком. Shocked

Версия MySql = 4.0.24

P.S. Спасибо огромное за пример работы с псевдонимами, а то как-то недопонимл что там происходит Very Happy [/code]
_________________
и это тоже пройдёт...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
suwayyah



Зарегистрирован: 24.04.2007
Сообщения: 5

СообщениеДобавлено: Ср Апр 25 2007 07:21    Заголовок сообщения: Ответить с цитатой

Еще одна маленькая особенность:
Код:

SELECT SUM(sub.chis1) FROM tbl AS sub WHERE sub.id <= tbl.id

А точнее:
Код:

SELECT SUM(sub.chis1) FROM tbl AS sub WHERE sub.id <= id

Работает причём правильно, вопрос меняется как заставить MySql принимать выражения типа:
Код:

... SET itogo = (SELECT bla bla bla, bla bla) ...


Интересно девки пляшут!!!
_________________
и это тоже пройдёт...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Ср Апр 25 2007 08:03    Заголовок сообщения: Что значит "..й до земли"? Вытянуть ..й или отрезать ноги? Ответить с цитатой

Не совсем понял: первый-то вопрос решился?
suwayyah писал(а):
как заставить MySql принимать выражения типа:
Код:
... SET itogo = (SELECT bla bla bla, bla bla) ...

Подробнее можно? И связан ли этот вопрос с первым?
---------------------------------------------------
Что значит "..й до земли"? Вытянуть ..й или отрезать ноги?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
suwayyah



Зарегистрирован: 24.04.2007
Сообщения: 5

СообщениеДобавлено: Ср Апр 25 2007 08:58    Заголовок сообщения: Ответить с цитатой

Да спасибо вопрос в общем то решился, он считает, осталась вторая часть -
когда пишешь
Код:

[переменная]=(SELECT ...)

то MySql выдаёт ошибку, но теперь эту часть я на BASH допишу, там можно через переменные и т.п., почти работает, только доведу до умаSmile поскольку работать то работает, но по ходу дела выдаёт ошибки, хотя считает правильноSmile и в базу заносит...
_________________
и это тоже пройдёт...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Ср Апр 25 2007 12:18    Заголовок сообщения: "Ну и запросы у вас!" -- сказала база данных и повисла Ответить с цитатой

А! Понятно. MySQL не поддерживает подзапросы в секции SET оператора UPDATE. Тогда надо запросом (который совпадает с подзапросом в моём втором примере)
Код:
SELECT sup.id, SUM (sub.chis1) AS sum_chis1 FROM tbl AS sup INNER JOIN tbl AS sub ON sup.id>=sub.id GROUP BY sup.id
создать временную таблицу с нарастающими итогами и потом выполнить UPDATE, либо, действительно, уже в шелловском скрипте просканировать таблицу и занести итоги для каждой записи отдельно.

Интересно, а зачем нарастающий итог в самой таблице? Это же избыточная, дублирующаяся, информация. Неужели в приложении, в котором нужна эта информация, нельзя получить нарастающий итог в самом приложении, а не держать его в таблице, либо использовать в качестве источника данных не саму таблицу, а выборку
Код:
SELECT sup.id, sup.chis1, SUM (sub.chis1) AS sum_chis1 FROM tbl AS sup INNER JOIN tbl AS sub ON sup.id>=sub.id GROUP BY sup.id, sup.chis1
содержащую нарастающий итог?
------------------------------------
"Ну и запросы у вас!" -- сказала база данных и повисла
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
suwayyah



Зарегистрирован: 24.04.2007
Сообщения: 5

СообщениеДобавлено: Ср Апр 25 2007 12:46    Заголовок сообщения: Ответить с цитатой

В общем то мне уже подсказали, что поле с нарастанием не нужно, но сам опыт был интересным, с MySql-ем знаком всего два дняSmile Но мне понравился, гибкий зараза, особенно в смеси со скриптомSmile) В общем спасибо за помощь, мне первый твой пример пригодиться, причём ой-какSmile)
_________________
и это тоже пройдёт...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Базы данных Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...