Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL从费率表计算呼叫成本_Mysql_Sql_Cdr - Fatal编程技术网

使用MySQL从费率表计算呼叫成本

使用MySQL从费率表计算呼叫成本,mysql,sql,cdr,Mysql,Sql,Cdr,我试图比较两个电话供应商之间的通话费率。我有两张表,如下: 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), callc

我试图比较两个电话供应商之间的通话费率。我有两张表,如下:

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 )
);
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
18185_费率包含来自电话系统的呼叫数据记录,一些示例值如下:

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 )
);
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_费率中的通话与其他提供商的通话成本。基于int_速率中的可变长度拨号代码,我无法计算如何连接这两个表

在下面@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;

我假设您希望将每个电话号码与前缀最长的费用相匹配。以下是一种方法:

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;

实际上,我会在第一个子查询中取出一个主键,然后连接回表,以便从该表中获取所需的任何字段。但是,您没有指定表布局,如果第一个查询具有合理的性能,那么也可以执行两次。

谢谢,您关于前缀匹配的假设是正确的。如果您认为第一行有输入错误,应该是“选择r.*”?根据您的帮助,您已经对上述问题添加了一些更新-希望听到您对拼图最后一点的想法!Thxthanks,最后一位运行良好,速度稍慢,但对于我的目的来说非常完美。@FilipeSilva抱歉,我只举了一部分数据作为示例,在int_费率表中,从18185_费率开始的每一次通话都应该有一个价格