0

基本的に、私は3つのテーブルを持っています:

  • cdr、フィールドdst(destination)、billsec(duration)、およびcalldate
  • code(国コード)、およびcost(1分あたり)を含むIntlrates 。
  • およびエリアコード。これには、、、およびが含まれます。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(ニューヨーク)の両方が合計に追加されます。最初のものは問題ありませんが、2番目のものはそうではないときに合計に追加されます。

これを回避するために、次の行に沿って何かに結合するための2番目の条件を変更する方法はありますか?

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

基本的に、コードが一致し、コードが国別エリアコードテーブルにない場合にのみ結合するように作成します。

結合を使用してこれを行う方法があると思います(またはおそらく存在します)が、データベースに関してはひどく不十分であり、それをどのように実装するかについてはまったくわかりません。あなたが必要とするより多くの情報があるならば申し訳ありません/この質問は無意味です。

4

3 に答える 3

1

ワイルドカード列セレクター*を使用すると、結合操作で使用されるすべてのテーブルのすべての列が取得されます。ワイルドカードを使用して許可するテーブルを指定するとt1.*, t2.*、それらのテーブルからのみ列を取得できます。

3 つのテーブルを結合 (およびフィルター処理) した場合でも、2 つのテーブルから情報を選択できることを知っています。

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これにより、最初の 2 つのテーブルの結果セットが生成され、条件が満たされたレコードが削除されます。

于 2012-12-27T18:52:04.737 に答える