Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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)
но как оказалось такое счастье не прокатит _________________ и это тоже пройдёт... |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 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) он выдаёт ошибку, если же просто присваивать определенные значения , то всё пучком.
Версия MySql = 4.0.24
P.S. Спасибо огромное за пример работы с псевдонимами, а то как-то недопонимл что там происходит [/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 допишу, там можно через переменные и т.п., почти работает, только доведу до ума поскольку работать то работает, но по ходу дела выдаёт ошибки, хотя считает правильно и в базу заносит... _________________ и это тоже пройдёт... |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 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-ем знаком всего два дня Но мне понравился, гибкий зараза, особенно в смеси со скриптом) В общем спасибо за помощь, мне первый твой пример пригодиться, причём ой-как) _________________ и это тоже пройдёт... |
|
Вернуться к началу |
|
|
|