Имам два телефонни номера, a-party и b-party, за които искам да намеря най-близката съвпадаща тарифа за разговори.
Има таблица с тарифи за разговори, съдържаща различни номера на a и b страни и тарифи за минута.
Когато търсите процент на разговори, първо се намира най-специфичното съвпадение в a-party. Ако бъде намерено съвпадение на b-party, се използва скоростта от най-конкретното съвпадение на b-party. Ако не бъде намерено съвпадение на b-партия за a-партия, следващото най-конкретно съвпадение на a-партия се разглежда, за да се види дали има съвпадение на b-партия. Ако не бъде намерено съответствие, трябва да се върне отделно съобщение.
i.e
call_rates
a-party b-party rate_per_min
6495631234 619234 0.10
6495631 6192 0.12
649 61923 0.09
649 61 0.16
За горните тарифи за разговори, обаждане от:
a-party: 6495631234
до b-party: 619234567
ще върне rate_per_min: 0.10
a-party: 6495631111
до b-party: 619234567
ще върне rate_per_min: 0.12
a-party: 6495631111
до b-party: 611112345
ще върне rate_per_min: 0.16
a-party: 6495631111
до b-party: 619234566
ще върне rate_per_min: 0.09
Ето как се опитвах да го направя досега. Това е много грубо очертание. Имам ограничен опит в писането на съхранени процедури.
Просто търся съвет дали има по-добър начин да се справя с това. Таблицата със скоростта на повикване ще бъде много голяма, така че мога да си представя, че двойният for цикъл ще бъде много неефективен.
Всяка обратна връзка ще бъде много оценена.
DELIMITER //
DROP PROCEDURE IF EXISTS `get_rate`;
CREATE PROCEDURE `get_rate` (a VARCHAR(45), b VARCHAR(45), OUT rate VARCHAR(45))
get_r:BEGIN
DECLARE i, j INT;
DECLARE match_string, result, temp_string VARCHAR(255);
SET j = LENGTH(b);
SET i = LENGTH(a);
WHILE i > 0 DO
SET temp_string = SUBSTRING(a,0,i);
SET result = (SELECT * FROM call_rate_overrides WHERE a_party LIKE CONCAT(temp_string, '%'));
WHILE j > 0 DO
SET temp_string = SUBSTRING(b,0,j);
SET match_string = (SELECT * FROM call_rate_overrides WHERE b_party LIKE CONCAT(temp_string,'%'));
IF ISNOTNULL(match_string) THEN
SET rate = match_string;
LEAVE get_r;
END IF;
SET j = j - 1;
END WHILE;
SET i = i - 1;
END WHILE;
END //