2017-04-27 5 views
2

これはSQLに関してはちょっとノービーです。実際には非常にそうです。だから、もしこれが自明であれば、私は謝罪します。SQL:Previous AVG()を設定するときにカラムが空になる

は、私は、データベースから3つの事を(この表が送られたすべてのメッセージのログです)を見つけるためにしようとしています:

  • 合計返信時間10分の下にあった回答の
  • 合計#
  •  SELECT 
          *, SUM(case when tmp.reply_time <= 10 then 1 else 0 end) as under_10_mins, 
          COUNT(tmp.reply_time) AS total_replies 
         FROM 
          (SELECT 
           TIMESTAMPDIFF(MINUTE, `date`, reply_date) as reply_time 
          FROM 
           tme_email_staff_reply sr 
          JOIN 
           tme_user u 
          ON 
           u.id = sr.staff_id 
          JOIN 
           tme_email_message m 
          ON   
           m.id = sr.message_id 
            WHERE 
           `reply_date` >= '2017-04-01 00:00:00' 
          AND 
           `reply_date` < '2017-04-27 00:00:00' 
          ) 
         AS tmp 
    
    :平均返信時間
  • ここ

は私のSQLです

| reply_time | under_10_mins | total_replies | 
    |  106 |   165 |   375 | 

を今、私は追加するとき:出力

 SELECT 
      *, SUM(case when tmp.reply_time <= 10 then 1 else 0 end) as under_10_mins, 
      COUNT(tmp.reply_time) AS total_replies 
     FROM 
      (SELECT 
       TIMESTAMPDIFF(MINUTE, `date`, reply_date) as reply_time, 
       (AVG(TIMESTAMPDIFF(SECOND, `date`, reply_date))/60) AS average_reply_time 
      FROM 
       tme_email_staff_reply sr 
      JOIN 
       tme_user u 
      ON 
       u.id = sr.staff_id 
      JOIN 
       tme_email_message m 
      ON   
       m.id = sr.message_id 
        WHERE 
       `reply_date` >= '2017-04-01 00:00:00' 
      AND 
       `reply_date` < '2017-04-27 00:00:00' 
      ) 
     AS tmp 

私の応答は次のとおりです。

| reply_time | average_reply_time |under_10_mins | total_replies | 
    |  106 |  149.08626667 |   0 |    1 | 

あなたが見ることができるように、under_10_minstotal_repliesフィールドが変更されました。

リンクされたテーブルのスキーマ:

tme_email_staff_reply:

id | staff_id | message_id |   reply_date | 
    1 | 234,221,001 | 15fg16d5dgw2 | 2017-04-01 09:34:16 | 

tme_user

id | username | password | email | dob | gender | 
    // data omited 

tme_email_message

id | thread_id | From | To | subject | message | message_id 
    // data omited 

これはなぜそうだと誰に教えてもらえますか?それを修正する方法は?

+0

テーブルのスキーマは何ですか? –

+0

@SloanThrasher - 1秒が追加されます。 – JamesG

答えて

2

なぜそうですか?

のはAVGを見てみましょう:

AVG([DISTINCT] expr)は

はexprの平均値を返します。 DISTINCTオプションを使用すると、exprの別個の値の平均を返すことができます。

一致する行がない場合、AVG()はNULLを返します。 13.19.1 Aggregate (GROUP BY) Function Descriptions

そしてドキュメントも言った:

を使用すると、GROUP BY句がないを含まない文でグループ機能を使用する場合、それはすべての行にグループ化することと同じです。詳細については、Section 13.19.3, “MySQL Handling of GROUP BY”を参照してください。

これはあなたのサブクエリでは意味、あなたはgroup byなしavgを使用し、これはavgすべての行は、サブクエリで1行を返します。

修正方法?

私はあなたが外側のクエリにサブクエリからavgを移動すべきだと思う:

SELECT 
    SUM(case when tmp.reply_time <= 10 then 1 else 0 end) as under_10_mins, 
    COUNT(tmp.reply_time) AS total_replies, 
    AVG(average_reply_time) AS average_reply_time 
FROM 
    (SELECT 
     TIMESTAMPDIFF(MINUTE, `date`, reply_date) as reply_time, 
     (TIMESTAMPDIFF(SECOND, `date`, reply_date))/60 AS average_reply_time 
    FROM 
     tme_email_staff_reply sr 
    JOIN 
     tme_user u 
    ON 
     u.id = sr.staff_id 
    JOIN 
     tme_email_message m 
    ON   
     m.id = sr.message_id 
      WHERE 
     `reply_date` >= '2017-04-01 00:00:00' 
    AND 
     `reply_date` < '2017-04-27 00:00:00' 
    ) 
AS tmp 
+0

これは私のために働いた。ありがとうございました。また、私を何かにリンクしてくれてありがとう。とても有難い。 – JamesG

+0

注意: 'reply_time'は外部クエリに意味がなく、' reply_time'ネストしたテーブルからのランダムな値です。私はtouさんを投稿しました**サーバーは各グループから任意の値を自由に選択できます**ソリューション提案を削除するまで投票します。 srr。 – danihp

+0

@danihp 'reply_time'を削除しましたが、これは役に立たないようです。また、アップアップは私のものです。 – Blank

1

この問題は、ネストされたクエリで、5.7.5のMySQLバージョンでGROUP BY句に指定されていない非集約カラムを参照しているためです。ドキュメントを参照してください:The server is free to choose any value from each group

MySQL < 5.7.5はこの構文を許すが、特殊な動作(あなたのケース)を持つ:

選択リストは、GROUP BY句で指定されていない非集約列を参照できるように、MySQLはGROUP BYの標準SQLの使用を拡張します。不要な列の並べ替えやグループ化を避けることにより、この機能をにすると、より良いパフォーマンスのが得られます。ただし、これは主に、GROUP BYで指定されていない各集約されていない列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるので、同じでない限り、選択された値は不定です。さらに、各グループからの値の選択は、ORDER BY句を追加することによって影響を受けることはありません。結果セットの並べ替えは、値が選択された後に発生し、ORDER BYはサーバーが選択する各グループ内の値に影響しません。

MySQL >= 5.7.5関数依存性のため、この構文をチェックできるよう:

のMySQL 5.7.5およびアップ道具関数依存性の検出。 ONLY_FULL_GROUP_BY SQLモードが有効になっている場合(デフォルトでは)、SELECTリスト、HAVING条件、またはORDER BYリストが、GROUP BY句で名前が付けられていないか、機能的に依存していない非集約カラムを参照するクエリは拒否されます。

+0

これについて私はレイメンの説明のためにお困りですか?私はGROUP BYを使用していないので、私は苦労しています..../ – JamesG

関連する問題