0

基本上,我有三个表:

  • cdr,其中包含字段dst(destination)、billsec(duration) 和calldate
  • Intlrates,其中包含code(国家代码)和cost(每分钟)。
  • areacode,其中包含areacodestatecity

目前我有一个声明,增加了调用每个代码的总成本,如下:

SELECT
  mapgtalkexten.Intlrates.`Code`,
  sum(mapgtalkexten.Intlrates.Cost * (cdr.billsec/60)) as totals
FROM
  cdr JOIN mapgtalkexten.Intlrates ON    
  ((`Code` = SUBSTRING(dst, 4, 3) or `Code` = SUBSTR(dst, 4, 2))
   and dst like "011%")
  --The above limits the join to only calls where the destination phone number
  --requires the exit code (011) and the country code is 2 or 3 digits    
  or (`Code` = SUBSTR(dst, 2, 3) and dst like "1%")
  --The above was written to also join countries where the NANP format was used
  --(i.e. +1787 for Puerto Rico.)    
WHERE
  cdr.calldate like "2012-11%"
  and billsec >0
GROUP BY
  mapgtalkexten.Intlrates.`Code`

输出示例:

Code | totals
--------------
212  | 2.035
240  | 170.76
352  | 2.268
49   | 0.45

现在,我的问题是:该Intlrates表在 NANP 和非 NANP 代码之间没有区别。这意味着在我的加入中,两者:

011212(摩洛哥)和1212(纽约)都被添加到总数中。第一个很好,第二个不应该增加总数。

为了避免这种情况,有没有办法将连接的第二个条件修改为以下内容:

`Code` = SUBSTR(dst, 2, 3) AND SUBSTR(dst, 2, 3) != areacode.areacode

基本上使它只有在代码匹配并且代码不在国家区号表中时才会加入。

我认为有一种方法可以通过连接(或者可能存在)来做到这一点,但是在数据库方面我非常不适应,并且完全不知道我将如何去实现它。抱歉,如果您需要更多信息/这个问题是荒谬的。

4

3 回答 3

1

使用通配符列选择器*时,您可以获得连接操作中使用的所有表的所有列。如果您指定哪些表,通配符t1.*, t2.*只允许您从这些表中获取列。

知道即使您连接(并过滤)了三个表,您也可以从两个表中选择信息。

SELECT        t1.*,
              t2.*
    FROM      table_1 AS t1
    LEFT JOIN table_2 AS t2
        ON    /*clauses*/
    LEFT JOIN table_3 AS t3
        ON    /*clauses*/
    WHERE    t3.column = value;
于 2012-12-27T18:49:38.500 回答
0

您可以在 SELECT 末尾添加 HAVING 语句,如下所示

HAVING `Code` = SUBSTR(dst, 2, 3) AND SUBSTR(dst, 2, 3) != areacode.areacode
于 2012-12-27T18:47:34.723 回答
-2

你会想要这样的东西:

 select results.*  
 from   
 (    
     --two table query here
 )results,third_table  
  where third_table.foo = results.bar
   --filter third table here

这样做是生成前两个表的结果集,然后删除third_table满足条件的记录。

于 2012-12-27T18:52:04.737 回答