У меня есть два телефонных номера, a-party и b-party, для которых я хочу найти ближайшую совпадающую скорость вызова.
Существует таблица тарифов на звонки, содержащая различные номера a-party и b-party и тарифы за минуту.
При поиске скорости вызова сначала находится наиболее точное совпадение в a-стороне. Если найдено совпадение b-стороны, используется скорость наиболее конкретного совпадения b-стороны. Если совпадение 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 //