Еще вопрос к мускулистым парням...

malls
На сайте с 08.08.2005
Offline
255
651

Такой вопрос - хочу вообще без пыхи обойтись - преполагаю что возможно но не "умею как" :)

Короче такая задача, есть таблица:

people

| id | name | dolg |
| 1 | Петя | 1505 |
| 2 | Вася | 2650 |
| 3 | Миша | 320 |
| 4 | Коля | 2333 |
...

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

SELECT nid,sum

| nid | sum |
| 1 | 150 |
| 7 | 177 |
| 8 | 222 |

задача пройтись по таблице peoples и в колонке dolg изменить значение на dolg=dolg+sum

т.е. примерно как то так:

UPDATE peoples SET dolg=dolg+[SELECT].sum WHERE id=[SELECT].nid

но вот как именно - в этом вся загвоздка.

Т.е. хочется проблему решить без циклов и пр., а просто одним простым мускульным запросом, иначе говоря - ТОЛЬКО средствами самого мускуля. Или такое невозможно?

REPLACE теоретически может с такой задачей справиться - но не хочется самого REPLACE использовать.

N
На сайте с 06.05.2007
Offline
419
#1

Пора вам почитать про представления в mysql 5 (view) и про то как их обновляют.

для начала сойдет и хабр http://habrahabr.ru/blogs/mysql/47031/

есть ограничения :

Соответствие 1 к 1 между строками представления и таблиц, на которых основано представление, т.е. каждой строке представления должно соответствовать по одной строке в таблицах-источниках.

Поля представления должны быть простым перечислением полей таблиц, а не выражениеями col1/col2 или col1+2

Если удастся добиться выполнения условий, будет удобно и красиво.

но это общие слова в случае сложных условий. view позволяет удобно оперировать сложными фактами.

вам сейчас кажется подойдет что-то вроде:

update table1 join (select a,b from table2) table2 on table1.a=table2.a

set table1.a=table1.a+table2.b;

выложите дамп и кто-нибудь поможет конкретный запрос написать. реконструировать таблицы по описанию страшно неудобно.

Кнопка вызова админа ()
malls
На сайте с 08.08.2005
Offline
255
#2

Классная статья - не знал вообще о такой штуке, внешне похоже на то что надо, но зараза в моем случае, при попытке сделать:

CREATE OR REPLACE VIEW v AS [SELECT]

т.е. из того самого моего селекта, ругается:

#1349 - View's SELECT contains a subquery in the FROM clause

т.е. на то что в нем вложенные селекты есть (и это так - там довольно сложно).

Т.е. на практике получается что представления не работают с вложенными запросами.

malls добавил 13.03.2009 в 13:44

А вот за это спасибо огромное, даже не так, а вот так: СПАСИБО ОГРОМНОЕ!!!:

netwind:
update table1 join (select a,b from table2) table2 on table1.a=table2.a
set table1.a=table1.a+table2.b;

Я как раз в этом то и сомневался, что можно джойнить в UPDATE - все отлично сработало!

N
На сайте с 06.05.2007
Offline
419
#3

view и есть по сути вложенный запрос. просто создайте несколько view на этих подзапросах.

да и второй вариант попробуйте. по сути это развернутый view

Z
На сайте с 01.06.2008
Offline
182
#4
Еще вопрос к мускулистым парням...

не про то подумал. Но, потом раздел посмотрел :D

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий