2016-11-02 18 views
3

私はMYSQL初心者だと私は、クエリに問題があります。MYSQL(一定の条件の下でSELECT)

私は2つのテーブル(通話をcallsfailed)持っています。

  1. には、これらの列(called_number、duration)があります。

    +---------------+----------------+ 
    | called_number | release_reason | 
    +---------------+----------------+ 
    | 1010101  | -1    | 
    | 1010101  | -1    | 
    | 2020202  | -1    | 
    | 3030303  | 406   | 
    | 4040404  | 503   | 
    | 5050505  | -1    | 
    | 5050505  | -1    | 
    | 6060606  | -1    | 
    +---------------+----------------+ 
    

    I:

    +---------------+----------+ 
    | called_number | duration | 
    +---------------+----------+ 
    | 1010101  | 13  | 
    | 1010101  | 18  | 
    | 1010101  | 20  | 
    | 2020202  | 50  | 
    | 2020202  | 20  | 
    | 3030303  | 10  | 
    | 4040404  | 30  | 
    +---------------+----------+ 
    

    そして表があるcallsfailed:

  2. は(called_number、release_reason)

通話表があると言うことを許可しますは、これらの列を持っているcallsfailed欲しいですcalled_number> 1を選択し、持続時間が25未満になると、またはrelease_reason = -1になります。 1回以上。

しかし caller_numberはより25以上継続した場合は、それはrelease_reasonを持っている場合でも、それを選択していないが= -1。

だから、結果は次のようになります。

+---------------+-------+ 
| called_number | count | 
+---------------+-------+ 
| 1010101  | 3  | 
| 5050505  | 2  | 
+---------------+-------+ 

MYコードです:

( SELECT called_number, duration, COUNT(*) count 
    FROM calls 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and duration < 25 
) 

UNION 

(SELECT called_number, release_reason, COUNT(*) count 
    FROM callsfailed 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and release_reason = -1 
) 
+2

を持つことができますのエントリ間のいずれかの関係があります1つのテーブル、別のテーブルに?たとえば、ある数字が 'release_reason'として' -1'と何か他のもの( '406')を持っている場合、結果はどうなるでしょうか? – Terry

+0

これは '-1'に焦点を合わせ、' 406'や他の理由を無視するだけです –

答えて

1

あなたのテーブルの問題のビットがあります派生テーブルとしてUNIONを使用して、この

SELECT t1.called_number, t1.count_calls FROM 
(
    SELECT called_number, MAX(duration) max_duration, COUNT(called_number) count_calls 
    FROM calls 
    GROUP BY called_number 
    HAVING COUNT(called_number) > 1 AND max_duration < 25  

    UNION  

    SELECT called_number, release_reason, COUNT(called_number) count_callsfailed 
    FROM callsfailed 
    GROUP BY called_number 
    HAVING COUNT(called_number) > 1 AND release_reason = -1 
) t1 

GROUP BY t1.called_number 

のようにそれを選択し、あなたの結果

+0

それは最も近いです答えはありがたいですが、ちょっとした問題ですが、それは2020202を与えました....... 2020202は25以上の期間を作ったので、結果には望みません。 –

+0

あなたはこのsqlfieldを見ることができます、それは私に2020202 http://sqlfiddle.com/#!9/83c879/1 – Aroniaina

+0

YESを与えてくれません。 –

2

は、あなたが参加

select t1.called_number, t1.duration, t1.count 
    from 

    ( SELECT called_number, duration, COUNT(*) count 
    FROM calls 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and duration < 25 
) t1 

    left join 

    (SELECT called_number, release_reason, COUNT(*) count 
    FROM callsfailed 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and release_reason = -1 
) t2 on t1.called_number = t2.called_number 

しかし、組合ができたために探していることでした。あなたはどこの期間e release_reasonのために必要なのですか

 SELECT called_number, duration, COUNT(*) count 
     FROM calls 
     WHERE duration < 25 
     GROUP BY called_number 
     Having COUNT(called_number) > 1 

     union 

     SELECT called_number, release_reason, COUNT(*) count 
     FROM callsfailed 
     GROUP BY called_number 
     where release_reason = -1 
     Having COUNT(called_number) > 1 
+0

私はこれを受け取りました [Err] 1052 - フィールドリストの 'called_number'列があいまいです –

+0

回答を更新しました – scaisEdge

+0

[Err] 1052 - フィールドリストの列数があいまいです :( –

1

質問にはいくつかの間隙があります。

  1. 予想される結果では、1010101のカウントは5ではないはずですか?
  2. called_number以外に、2つのテーブルの エントリ間に関係がありますか?
  3. あなたのコードは、あなたが望む結果を得る可能性が非常に低いです。ここで

であるあなたが達成したいかについての私の最高の推測

(通話FROM C1 AS called_number、COUNT( )を選択からのカウントAS

SELECT T1.called_number、(T1.C1 + T2.C2) WHERE called_number BY期間< 25 GROUP)T1 はJOIN T1.called_number = T2.called_number ON callsfailed release_reason = -1 GROUP BY called_number)T2 (T1.C1 + t2からC2 AS(called_number、COUNT(選択)。C2)> 1;

+0

(1.Theカウントは1以上でなければならない) (2.durationおよびrelease_reason、they 、 [1010101 - - 5] [2 2020202]:-1 )25から構成することができる(3.Itはあなたのコード:() と私は同じ結果を与え、あなたのコードは、私にこの結果を与え ((BUT 2020202は25を超える期間を過ぎました!!!) –

+0

1.一般的に、徹底的に人生を助けます。あなたの返事は意味をなさない。私は、あなたのコードと私のコードがあなたに同じ結果をもたらしたとは信じられません。 –

+0

あなたの結果 + --------------- + ---------- + ------- + | called_number |期間|カウント| + --------------- + ---------- + ------- + | 1010101 | 13 | 3 | | 1010101 | -1 | 2 | | 5050505 | -1 | 2 | + --------------- + ---------- + ------- + –