2016-11-04 3 views
3

私は3つのテーブルを持っています:名前、登録、更新。 LEFT JOINを使用して3つのテーブルを共通のIDで結合しています。複数のJOINを使用すると誤ったCOUNTが返される

私は各ユーザーの登録数と更新数を数えます。私はGROUP BYフィールドでさまざまなオプションを使用しようとしましたが、うまくいきませんでした。ここで

はSELECT文です:

SELECT 
    names.name_id AS 'Names ID' 
    ,names.name AS Name 
    ,count(registrations.date) AS Registrations 
    ,count(renewals.date) AS Renewals 

FROM names 

LEFT JOIN registrations 

    ON names.name_id = registrations.name_id 

LEFT JOIN renewals 

    ON renewals.name_id = registrations.name_id 

GROUP BY names.name_id, registrations.name_id, renewals.name_id; 

そして、ここでは3つのテーブルです:

+----------+------+---------------+----------+ 
    | Names ID | Name | Registrations | Renewals | 
    +----------+------+---------------+----------+ 
    |  1 | Ana |    4 |  4 | 
    |  2 | John |    2 |  2 | 
    |  3 | Paul |    3 |  0 | 
    +----------+------+---------------+----------+ 

私は正しい結果:

TABLE: names 
    +---------+------+ 
    | name_id | name | 
    +---------+------+ 
    |  1 | Ana | 
    |  2 | John | 
    |  3 | Paul | 
    +---------+------+ 

    TABLE: registrations 
    +-----------------+---------+---------------------+-------+ 
    | registration_id | name_id | date    | value | 
    +-----------------+---------+---------------------+-------+ 
    |    1 |  1 | 2014-01-30 13:15:02 | 15 | 
    |    2 |  2 | 2014-05-01 18:01:44 | 15 | 
    |    3 |  2 | 2014-07-08 15:10:43 | 20 | 
    |    4 |  3 | 2012-09-28 17:45:32 | 15 | 
    |    5 |  3 | 2014-01-09 18:26:14 | 20 | 
    |    6 |  3 | 2015-01-10 13:22:01 | 25 | 
    +-----------------+---------+---------------------+-------+ 

    TABLE: renewals 
    +------------+---------+---------------------+-------+ 
    | renewal_id | name_id | date    | value | 
    +------------+---------+---------------------+-------+ 
    |   1 |  1 | 2015-01-30 00:00:00 | 5  | 
    |   2 |  1 | 2016-02-12 00:00:00 | 5  | 
    |   3 |  1 | 2015-06-01 00:00:00 | 5  | 
    |   4 |  1 | 2013-11-24 00:00:00 | 5  | 
    |   5 |  2 | 2015-01-27 00:00:00 | 5  | 
    +------------+---------+---------------------+-------+ 

は、ここで私が取得しています誤った結果です期待していた:

+----------+------+---------------+----------+ 
    | Names ID | Name | Registrations | Renewals | 
    +----------+------+---------------+----------+ 
    |  1 | Ana |    1 |  4 | 
    |  2 | John |    2 |  1 | 
    |  3 | Paul |    3 |  0 | 
    +----------+------+---------------+----------+ 

正しい結果を得るためにクエリを修正するにはどうすればよいですか?

+0

'count(distinct ...) 'を使用すると効果があります。それはあなたの日付が登録/更新毎に "ユニーク"であると仮定します。他の問題では、きれいにはうまくいかないかもしれません。一般的な修正では、各テーブルのカウントを個別に生成し、それらの結果を結合することです。 – shawnt00

+0

それは仕事をしました。ありがとうございました。 – noahstime

答えて

0

あなたのクエリはうまく実行されます。

最初の参加後に、Anaのエントリが1つ、Johnのエントリが2つ、Paulのエントリが3つあります。

秒後にAnaのエントリが4回複製され、4回の更新で結合(連結)されます。あなたが今Anaの登録日を数えれば、あなたは4になります。それはあなたの「誤り」がどこから来たかです。

例えば、distinctの日付を数えて修正できます。

+2

DISTINCTを追加するとジョブが終了しました。ありがとうございました。 – noahstime

2

これを試してみてください:

SELECT 
    names.name_id AS 'Names ID' 
    ,names.name AS Name 
    ,count(distinct registrations.registration_id) AS Registrations 
    ,count(distinct renewals.renewal_id) AS Renewals 
FROM names  
LEFT JOIN registrations  
    ON names.name_id = registrations.name_id  
LEFT JOIN renewals  
    ON renewals.name_id = registrations.name_id  
GROUP BY names.name_id, registrations.name_id, renewals.name_id; 

私はこの種の問題に実行するたびに、私はあなたのサーバがそれを取ることができれば、それだけでselect *クエリを実行するのに役立ちます見つけます。このように:

SELECT * 
FROM names  
LEFT JOIN registrations  
    ON names.name_id = registrations.name_id  
LEFT JOIN renewals  
    ON renewals.name_id = registrations.name_id ; 

これは、あなたが本当に何を見ているか見ることができます。

+0

優秀!出来た。どうもありがとうございました。 – noahstime

+0

@noahstime、素晴らしいそれがあなたのために働いた場合、私の答えを "受け入れてください"。 – CGritton

関連する問題