![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Среди прочих есть таблицы
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х праздников, то у него на все след скидка 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 появл столбцы скидка и окончат счет?
или лучше это сделать через процедуры?
Неактивен
1)Через триггер Вы это никак не сделаете.
2) Можно вносить изменения в fests через процедуру и в случае возникновения у клиента более двух заказов создавать другое представление.
3) А можно сразу сделать другое представление с учетом новых стлобцов.
Отредактированно vasya (26.05.2008 20:13:44)
Неактивен
Пишу процедуру чтобы, показать, что у пост клиентов скидки:
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)
Неактивен
Вы путает IF, который является функцией языка, и конструкцию IF..END IF.
Посмотрите тему
http://sqlinfo.ru/forum/viewtopic.php?id=55
Неактивен
я немного изменила, но все равно не работает
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 ;
как правильно сделать, подскажите пожалуйста!
Неактивен
1) Условная конструкция IF ... END IF не является функцией языка и не может быть использована внутри запроса (т.е. выражения SELECT).
Обратите внимание на синтаксис
Неактивен
как сделать триггер, чтобы когда 2 и более заказа у клиента в fests, в smeta появл столбцы скидка и окончат счет?
Как уже сказал vasya, через триггер такое делать не стоит (можно, но слабоосмыслено).
Вы лучше расскажите, зачем Вам нужно переменное количество столбцов - наверняка можно обойтись без этого (есть ведь функция IF()..)
Неактивен
спасибо)))))
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> \. c/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>
Неактивен
2) В операторе SELECT сначала идет указание столбцов, которые будут выбраны, а затем таблиц, из которых будет идти выборка. И никак иначе. У Вас же в запросе дважды используется часть "from fests". Первое упоминание нужно удалить.
Неактивен
ну я балда)))
действительно)
спасибо большое.
Неактивен