SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.05.2008 18:25:13

devushka
Участник
Зарегистрирован: 24.05.2008
Сообщений: 8

помогите написать триггер

Среди прочих есть таблицы
CREATE TABLE Fests (id_fest INT unsigned NOT NULL auto_increment PRIMARY KEY ,id_man INT unsigned NOT NULL,id_cli INT unsigned NOT NULL,guests int, days_need int);

и

CREATE TABLE Salary (id_man INT unsigned NOT NULL, post varchar(20),hour float(6,2),salary float(6,2));

Нужно написать триггер, чтобы если вносятся данные в табл праздники fests , то в таблице salary автоматически высчитывалась 
заработная плата менеджера соотв по формуле
set salary=salary+8*hour*days_need
hour-это оплата в час)

Неактивен

 

#2 25.05.2008 02:36:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: помогите написать триггер


create trigger fests_ia
after insert on fests
for each row
update Salary set salary=(salary+8*`hour`*new.days_need)
 where Salary.id_man=new.id_man;


P.S. Обратите внимание на название триггера - fetsts_ia. До знака подчеркивания идет название таблицы, после две буквы обозначающие событие (INSERT, UPDATE, DELETE) и время (BEFORE, AFTER). Очень удобное соглашение, рекомендую использовать.

Неактивен

 

#3 25.05.2008 18:41:25

devushka
Участник
Зарегистрирован: 24.05.2008
Сообщений: 8

Re: помогите написать триггер

о спасибо) отлично
а например если я хочу , чтобы если у клиента заказано более 2х праздников, то у него на все след скидка 20%

CREATE TABLE Clients (id_cli INT unsigned NOT NULL auto_increment PRIMARY KEY,name varchar(30),adress varchar(20),phone varchar(15),regular enum('yes','no'));
            regular здесь должно становиться yes

при внесении изменения в fests, те когда у конкр клиента более 2х заказов
CREATE TABLE Fests (id_fest INT unsigned NOT NULL auto_increment PRIMARY KEY ,id_man INT unsigned NOT NULL,id_cli INT unsigned NOT NULL,guests int, days_need int);

у меня есть представление smeta, в котором к конкр празнику ставится в соотв его цена
drop view if exists smeta;
CREATE VIEW smeta AS
SELECT fests.id_fest, fests.id_cli,sum(service_total.total)+sum(food_total.total) AS scet FROM service_total,food_total NATURAL JOIN Fests WHERE service_total.id_fest=food_total.id_fest GROUP BY fests.id_fest ;

как сделать триггер, чтобы когда 2 и более заказа у клиента в fests, в smeta появл столбцы скидка и окончат счет?
или лучше это сделать через процедуры?

Неактивен

 

#4 26.05.2008 20:12:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: помогите написать триггер

1)Через триггер Вы это никак не сделаете.

2) Можно вносить изменения в fests через процедуру и в случае возникновения у клиента более двух заказов создавать другое представление.

3) А можно сразу сделать другое представление с учетом новых стлобцов.

Отредактированно vasya (26.05.2008 20:13:44)

Неактивен

 

#5 27.05.2008 00:43:54

devushka
Участник
Зарегистрирован: 24.05.2008
Сообщений: 8

Re: помогите написать триггер

Пишу процедуру чтобы, показать, что у пост клиентов скидки:

DELIMITER $$
DROP PROCEDURE IF EXISTS skidki
CREATE PROCEDURE skidki
BEGIN
create temporary table skidki_post_klientam
SELECT id_cli, count(id_fest) as kolichestvo_zakazov from fests,
IF count(id_fest)>0, 10) AS skidka_procenti
ELSE IF count(id_fest)>1, 20) AS skidka_procenti FROM  fests
group by id_cli;
select * from skidki;
END ;


а ОН ругается((

ERROR 1064 (42000): 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 'CREATE PROCEDURE skidki
BEGIN
create temporary table skidki_post_klientam
SELEC' at line 2
mysql>

Отредактированно devushka (27.05.2008 00:59:10)

Неактивен

 

#6 27.05.2008 01:35:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: помогите написать триггер

Вы путает IF, который является функцией языка, и конструкцию IF..END IF.

Посмотрите тему
http://sqlinfo.ru/forum/viewtopic.php?id=55

Неактивен

 

#7 27.05.2008 12:43:08

devushka
Участник
Зарегистрирован: 24.05.2008
Сообщений: 8

Re: помогите написать триггер

я немного изменила, но все равно не работает

DELIMITER $$
DROP PROCEDURE IF EXISTS skidki
CREATE PROCEDURE skidki
BEGIN
create temporary table skidki_post_klientam SELECT id_cli, count(id_fest) as kolichestvo_zakazov from fests,
IF (count(id_fest)>0) THEN 10 AS skidka_procenti
ELSE IF (count(id_fest)>1) THEN 20 AS skidka_procenti FROM  fests
group by id_cli;
select * from skidki;
END IF;
END ;

как правильно сделать, подскажите пожалуйста!

Неактивен

 

#8 28.05.2008 03:39:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: помогите написать триггер

1) Условная конструкция IF ... END IF не является функцией языка и не может быть использована внутри запроса (т.е. выражения SELECT).
Обратите внимание на синтаксис


IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

statement_list состоит из одного или более запросов.
Подробнее с примерами см. http://dev.mysql.com/doc/refman/5.1/en/ … ement.html

2) В операторе SELECT сначала идет указание столбцов, которые будут выбраны, а затем таблиц, из которых будет идти выборка. И никак иначе. У Вас же в запросе дважды используется часть "from fests".

Вывод. В части перечисления столбцов Вам нужно использовать функцию if(). http://dev.mysql.com/doc/refman/5.1/en/ … tions.html

Неактивен

 

#9 28.05.2008 05:32:55

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: помогите написать триггер


DELIMITER $$
DROP PROCEDURE IF EXISTS skidki $$ -- DROP PROCEDURE - отдельная команда; её нужно заканчивать delimiter'ом

CREATE PROCEDURE skidki() BEGIN

CREATE TEMPORARY TABLE skidki_post_klientam
    SELECT id_cli,
    count(id_fest) as kolichestvo_zakazov from fests,
    IF (count(id_fest) > 1, 20, IF(count(id_fest) > 0, 10, 0)) AS skidka_procenti
    FROM  fests
    GROUP by id_cli;
   
SELECT * FROM skidki; -- а зачем теперь делать такой запрос? Может быть, не skidki, а skidki_post_klientam?

END;
$$


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

как сделать триггер, чтобы когда 2 и более заказа у клиента в fests, в smeta появл столбцы скидка и окончат счет?

Как уже сказал vasya, через триггер такое делать не стоит (можно, но слабоосмыслено).

Вы лучше расскажите, зачем Вам нужно переменное количество столбцов - наверняка можно обойтись без этого (есть ведь функция IF()..)

Неактивен

 

#10 28.05.2008 16:40:24

devushka
Участник
Зарегистрирован: 24.05.2008
Сообщений: 8

Re: помогите написать триггер

спасибо)))))
DELIMITER $$
DROP PROCEDURE IF EXISTS skidki $$
CREATE PROCEDURE skidki()
BEGIN
CREATE TEMPORARY TABLE skidki_post_klientam
    SELECT id_cli,
count(id_fest) AS kolichestvo_zakazov FROM fests,
    IF (count(id_fest) > 1, 20, IF(count(id_fest) > 0, 10, 0)) AS skidka_procenti
    FROM  fests
    GROUP BY id_cli;
   SELECT * FROM skidki_post_klientam ;
END;
$$

о нет, ругается на синтаксис!! ну что не так?

mysql> \. chmm/skidki_post_klientam.sql
Query OK, 0 rows affected, 1 warning (0.01 sec)

ERROR 1064 (42000): 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 'IF (count(id_fest) > 1, 20, IF(count(id_fest)
> 0, 10, 0)) AS skidka_procenti
  ' at line 6
mysql>

Неактивен

 

#11 28.05.2008 18:39:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: помогите написать триггер

2) В операторе SELECT сначала идет указание столбцов, которые будут выбраны, а затем таблиц, из которых будет идти выборка. И никак иначе. У Вас же в запросе дважды используется часть "from fests". Первое упоминание нужно удалить.

Неактивен

 

#12 29.05.2008 00:25:26

devushka
Участник
Зарегистрирован: 24.05.2008
Сообщений: 8

Re: помогите написать триггер

ну я балда)))
действительно)
спасибо большое.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson