Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер с вложенным запросом / 8 сообщений из 8, страница 1 из 1
17.05.2016, 18:11
    #39237696
Evgeniy57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
Прошу помочь написать триггер, который будет выполнять следующий запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE kp_sentences kp
	INNER JOIN (
		SELECT sentence_id, SUM(cost) as sum FROM kp_sentences_service
		 WHERE sentence_id = OLD.sentence_id
		 GROUP BY sentence_id
	) as c ON (kp.id = c.sentence_id)
	 SET kp.services_cost = c.sum





Проблема заключается в том, что у меня не получается переделать подобный запрос так, что бы он работал в триггере, я так понимаю поля NEW и OLD не доступны во вложенных запросах. А если не использовать вложенный запрос, то получается как-то не очень хорошо.


Так же мне интересно, что будет в случае обновления сразу нескольких строк в таблице на которой будет этот триггер, я могу это конечно проверить или погуглить, но мне интересно хорошо ли это делать или будет лучше делать это в коде (php)?
И еще, есть ли возможность сделать триггер сразу и на обновление и на создание таблицы, не создавая двух одинаковых.
...
Рейтинг: 0 / 0
17.05.2016, 18:16
    #39237699
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
Где триггер, какой триггер, нахрена он вообще нужен... нипанятна.

Evgeniy57что будет в случае обновления сразу нескольких строк в таблице на которой будет этот триггерТриггер всегда обрабатывает вставку/обновление/удаление ОДНОЙ записи. Сколько записей затронуто, столько раз и "выстрелит" триггер.

Evgeniy57есть ли возможность сделать триггер сразу и на обновление и на создание таблицы, не создавая двух одинаковых.Нет. Да и не могут они быть одинаковыми.

Evgeniy57я могу это конечно проверить или погуглить
Лучше бы ты мог документацию почитать...
...
Рейтинг: 0 / 0
17.05.2016, 18:26
    #39237705
Evgeniy57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
Akina, да тут не очень важно какой и где триггер, нужно просто как-то запрос переделать таким образом, что бы не было джоина со вложенным запросом.

Читал я документацию, перестраховываюсь.
...
Рейтинг: 0 / 0
17.05.2016, 18:44
    #39237711
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
Ну тогда покажите DDL таблиц (лишние поля - поскипать), и объясните суть происходящего.

Evgeniy57нужно просто как-то запрос переделать
Никогда не переделывай. Всегда делай с нуля.
...
Рейтинг: 0 / 0
17.05.2016, 19:42
    #39237735
Evgeniy57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
Akina, ок. Имеем две таблицы:
table a
id | total_cost

table b
id | a_id | cost

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

Тот запрос, что я писал выше, справляется с этой задачей, приведу его к нашему примеру:

Код: sql
1.
2.
3.
4.
5.
6.
UPDATE a
	INNER JOIN (
		SELECT id, SUM(cost) as sum FROM b
		 GROUP BY a_id
	) as b ON (a.id = b.a_id)
	 SET a.total_cost = b.sum



Но в триггере такой запрос не прокатит, нам не надо каждый раз пересчитывать всю таблицу - это лишняя нагрузка. Нам нужно считать только конкретные изменения в конкретной записи (прибавлять или вычитать из суммарной стоимости в таблице а).
Тут то и проблема, так как мы не можем засунуть поля NEW и OLD в этот вложенный запрос и выполнять условие (WHERE), с ним.
...
Рейтинг: 0 / 0
17.05.2016, 19:55
    #39237739
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
Evgeniy57,

зачем вложенный запрос?
update a set total_cost = total_cost + new.cost - old.cost where a.id=a_id;
...
Рейтинг: 0 / 0
17.05.2016, 19:59
    #39237741
Evgeniy57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
retvizan, хмм.. и правда, как я сам не догадался, видимо нужно поспать. Ведь группировка то больше не нужна, раз мы только с одним полем работает.

Спасибо большое!
...
Рейтинг: 0 / 0
17.05.2016, 20:18
    #39237745
Evgeniy57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с вложенным запросом
с одной строчкой*
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер с вложенным запросом / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]