2010-12-27 22 views
3

助けてください。私はMySQL 5.1.30 Community Editionを使用しています。2つのクエリで同じデータベースに異なる結果が得られます

私は4つのテーブルを持っている:NTSは、オペレータは、国は、テーブル `operator`の列` id`への外部キーである1列( `operatorId`)がnts`

  • テーブルを` cooperationtypeし、テーブルcoopertype
  • テーブルオペレータのカラムidに外来キーである1カラム( `voice`)テーブルオペレータは、テーブル国のカラム(` id`)に対する外部キーである1つのカラム( `country_id`)を持っています

私は、音声番号のすべての価値がある事業者と国の数を取得したいtは 'N/A' に等しく、このクエリでcooperationtype.idによってそれらをグループ化:このクエリの合計が154カ国で、376

 
cooptype country operator 
1   128   348 
2   11   11 
3   15   17 

SELECT cooperationtype.id AS cooptype, COUNT(DISTINCT country_id) AS country, COUNT(DISTINCT operatorId) AS operator FROM nts INNER JOIN operator ON operator.id = nts.operatorId INNER JOIN country ON operator.country_id = country.id INNER JOIN cooperationtype ON cooperationtype.id = nts.voice WHERE cooperationtype.code <> 'N/A' GROUP BY cooperationtype.id

私はこの結果を得ました演算子。その後、

しかし、私は声の値のすべてに関係なく、このクエリでcooperationtype.idの、「N/A」に等しくない事業者や国のカウントのすべてを取得したい:

SELECT COUNT(DISTINCT country_id) AS country, COUNT(DISTINCT operatorId) AS operator FROM nts INNER JOIN operator ON operator.id = nts.operatorId INNER JOIN country ON operator.country_id = country.id INNER JOIN cooperationtype ON cooperationtype.id = nts.voice WHERE cooperationtype.code <> 'N/A'

私はこの結果を得た:

 
country operator 
133  372 

を私の質問は以下のとおりです。

  1. 最初のクエリの結果の合計が2番目のクエリの結果と等しくないのはなぜですか?
  2. 正しい結果はどれですか?

データ例:最初の問合せのため

voice  country operator 
1   US  1 
1   US  2 
1   UK  3 
1   UK  4 
2   US  1 
2   US  2 

、データを生成する必要があり:データが生成すべき第二のクエリについて

cooptype country operator 
1   2   4 
2   2   2 

を:

country operator 
2   4 

答えて

3

なぜ最初のクエリの結果は2番目のクエリの結果と等しくなりませんか?

COUNT(DISTINCT)を使用しているためです。

グループごとに異なるレコードをカウントします。

最初のクエリでは同じ国の2つのレコードがカウントされますが、cooptypeは2回(cooptypeでグループ化されているため)、2回目のクエリで1回カウントされます。

どちらが正しい結果ですか?

どちらも正しいです。

1   2 
2   1 

を、あなたが持っているので、第二は、

2 

を返します:最初のクエリが返されます

cooptype country 
1   US 
1   US 
1   UK 
1   UK 
2   US 
2   US 

:与えられたデータについては

    あなたの定義における "権利" である cooptype = 2US
  • 2の異なる国全体の(USUK

cooptype = 1USUK)での

  • 2の異なる国
  • 1の異なる国"正しい"は、この定義に依存します。

    あなただけの2番目のクエリは、最初の1の結果を一致させたい場合は

    は、
    SELECT COUNT(DISTINCT cootype, country_id) AS country, 
         COUNT(DISTINCT cooptype, operatorId) AS operator 
    FROM nts 
    INNER JOIN 
         operator 
    ON  operator.id = nts.operatorId 
    INNER JOIN 
         country 
    ON  operator.country_id = country.id 
    INNER JOIN 
         cooperationtype 
    ON  cooperationtype.id = nts.voice 
    WHERE cooperationtype.code <> 'N/A' 
    

    を使用しますが、再び、これはあなたの最初のクエリがあるとして間違っている可能性があります。これらのデータについては

    cooptype country operator 
    1   US  1 
    1   US  1 
    1   UK  2 
    1   UK  2 
    2   US  1 
    2   US  1 
    

    は、どのような正しい結果セットをだろうか?

  • +0

    2番目のクエリで期待される結果は、すべての演算子と国をntsテーブルに入れることです。だから私は最初のクエリの結果を使用し、それを合計する必要がありますか? – Hamdan

    +0

    @Hamdan:クエリに 'DISTINCT'があります。それは目的ですか?また、コードをコメントに入れないでください:代わりに、自分の投稿を更新してください。サンプルデータセットに適切なフィールドを追加して、クエリの出力を投稿してください。私は正しい質問を書く必要があります。 – Quassnoi

    +0

    申し訳ありませんが、私はまだ新しいです。私は自分の投稿を更新しました – Hamdan

    関連する問題