Получение цены услуги

Sep 26, 2009 01:52

Было:
CREATE FUNCTION `realPrice`(orderIN INT(20), currIN INT(20)) RETURNS INT(11)
BEGIN
DECLARE t_cur INT(10);
DECLARE t_service INT(10);
DECLARE t_price INT(10);
SELECT customPriceCurr INTO t_cur FROM orders WHERE id = orderIN ;
IF(t_cur = 0) THEN
SELECT service_id INTO t_service FROM orders WHERE id = orderIN ;
SELECT ConvertCurrency(currency,currIN,price)
INTO t_price FROM services WHERE id = t_service ;
ELSE
SELECT ConvertCurrency(t_cur,currIN,customPrice)
INTO t_price FROM orders WHERE id = orderIN ;
END IF;
RETURN t_price;
END$$

Стало:
CREATE FUNCTION `oPrice`(oid INT(20), curr INT(20)) RETURNS INT(11)
BEGIN
DECLARE res INT(16);
SELECT
IF (orders.customPriceCurr,
ConvertCurrency(orders.customPriceCurr,curr,orders.customPrice),
ConvertCurrency(services_price.currency,curr,services_price.price)
) INTO res
FROM orders,services_price
WHERE
orders.id=oid AND
orders.service_id = services_price.service_id AND
orders.period = services_price.period;
RETURN res;
END$$

Основная проблема, которая меня сейчас волнует - при текущей логике вместо вызывания функции oPrice я мог бы воткнуть во все запросы код этой функции и нехило сэкономить ресурсов. Но - подсчет цены должен в ближайшем будующем усложнится дополнительными условиями (нормальные промо-коды) и чтобы не переписывать код примерно в 20-30 местах я везде втыкаю вызов oPrice. А это приводит к дополнительному селекту на каждую строчку.

С одной стороны - и ладно, выполняется на стороне мускля, сеть не отдельные запросы не дергается и в целом это практически неотличимо быстро, но все же этот вопрос меня волнует. Как лучше сделать так, чтобы со всех сторон было хорошо?
noimport

sql

Previous post Next post
Up