2013-09-03 4 views
0

두 전화 회사 간의 콜금리를 비교하려고합니다. 다음과 같이 내가 두 개의 테이블이 있습니다MySQL을 사용하여 요율 테이블에서 통화 비용을 계산하십시오.

CREATE TABLE 18185_rates (
    calldate DATE, 
    calltime TIME, 
    calledno VARCHAR(20), 
    duration INTEGER(8), 
    callcost FLOAT(5 , 3) 
); 

CREATE TABLE int_rates (
    dialcode VARCHAR(20), 
    description VARCHAR(20), 
    callcost FLOAT(5 , 3) 
); 

18185_rates은 전화 시스템에서 통화 데이터 기록을 포함, 몇 가지 예를 들어 값은 다음과 같이

calldate,calltime,calledno,duration,callcost 
2013-07-30,11:21:38,35342245738,10,0.050 
2013-07-30,16:19:25,353872565822,37,0.130 
2013-08-02,08:31:12,65975636187,1344,0.270 
2013-08-05,11:03:53,919311195965,2356,1.640 

테이블 int_rates 다른 공급자로부터 통화 요금 데이터를 포함 다음과 같은 형식 :

dialcode,description,callcost 
1,USA,0.012 
1204,Canada,0.008 
1204131,Canada,0.018 
1226,Canada,0.008 
1226131,Canada,0.018 
1242,Bahamas,0.137 
1242357,Bahamas Mobile,0.251 
1242359,Bahamas Mobile,0.251 

내가 18185_rates의 호출이 다른 제공자와 비용이 얼마나 많이 볼 수 있도록 내가 비교를 실행하려합니다. int_rates 가변 길이 전화 걸기 코드를 기반으로 두 테이블을 조인하는 방법을 해결할 수 없습니다. 아래 @Gordon Linoff의 도움 후

, 나는 다음과 같은 코드로 왔어요 : 난 당신이 가장 긴 접두사가 비용을 각각의 전화 번호와 일치 할 것을 가정하고

SELECT 
    r.*, 
    (SELECT permin 
    FROM int_rates ir1 
    WHERE r.calledno LIKE CONCAT(ir1.dialcode, '%') 
    ORDER BY dialcode DESC 
    LIMIT 1) AS newcostpermin 
FROM 
    18185_rates r; 
+0

@FilipeSilva 죄송합니다. 필자는 데이터의 하위 집합만을 예로 듭니다. int_rate 테이블에서 18185_rates의 모든 통화에 대해 가격이 책정되어야합니다. – btongeorge

답변

0

. 이 호출의 시작과 일치하는 가장 긴 dialcode을 찾기 위해 상관 하위 쿼리를 사용

select ir.*, 
     (select callcost 
     from int_rates ir 
     where r.calledno like concat(ir.dialcode, '%') 
     order by length(ir.dialcode) desc 
     limit 1 
     ) as TheirCost 
from 18185_rates r; 

: 여기 방법입니다. 일치하는 항목이 없으면 NULL이됩니다. 또한, 이것은 효율적이지 않고 인덱스를 사용할 수 없습니다.

편집 :이 접근하는 여러 가지 방법이 있습니다

. 간단한 그냥 하위 쿼리를 복제하는 것입니다

select ir.*, 
     (select callcost 
     from int_rates ir 
     where r.calledno like concat(ir.dialcode, '%') 
     order by length(ir.dialcode) desc 
     limit 1 
     ) as TheirCost, 
     (select description 
     from int_rates ir 
     where r.calledno like concat(ir.dialcode, '%') 
     order by length(ir.dialcode) desc 
     limit 1 
     ) as TheirDescription 
from 18185_rates r; 

실제로, 나는 내가 그 테이블에서 원하는 필드를 얻기 위해 다시 테이블에 가입 한 후 첫 번째 하위 쿼리에서 기본 키를 빼고 것이다. 그러나 테이블 레이아웃을 지정하지 않고 첫 번째 쿼리의 성능이 적절하다면 두 번 수행하는 것이 좋습니다.

+0

감사합니다. 접두사 일치에 대한 가정이 정확합니다. "r. *"을 선택해야 첫 번째 줄에 오타가 있다고 생각하십니까? – btongeorge

+0

귀하의 도움에 따라 위 질문에 대한 몇 가지 업데이트를 추가했습니다 - 퍼즐의 마지막 부분에 대한 생각을 듣고 싶습니다! Thx – btongeorge

+0

고마워요, 그 마지막 비트가 잘 작동, 조금 느린하지만 내 목적을 위해 완벽. – btongeorge