2017-09-11 15 views
-1

ための "グループ機能の不正利用" 私はこのスキーマを使用してデータベースを有する:TRUNCATE(SUM())/ TIMESTAMPDIFFクエリ

ポスト(ID:整数、のcreated_at:日時、deleted_at:日時)
を posts_reasons(post_idの整数はreason_id:整数
理由(ID:整数、重量:整数)

I 0との間の平均時間を見つけるために探していとposts.deleted_at(も削除までの時間として知られている)いくつかのサンプルの結果は、これらの線に沿ってあるかもしれない10の範囲でreasons.weightのSUMとポストのグループごと:

Total Reason Weight (groups of 10) | Average Time To Deletion 
--------------------------------------+---------------------------- 
            0 | 987.36 
            10 | 872.01 
            20 | 819.34 
            30 | 742.77 

のように。私は、削除する時間が異常値を避けるために1時間/ 3600秒より長い投稿を除外しています。

これは、これまで私が持っているクエリです:

SELECT 
    TRUNCATE(SUM(reasons.weight), -1) AS 'Reasons Weight', 
    AVG(TIMESTAMPDIFF(SECOND, posts.created_at, posts.deleted_at)) AS 'Avg Time To Deletion' 
FROM 
    posts 
    INNER JOIN posts_reasons ON posts_reasons.post_id = posts.id 
    INNER JOIN reasons ON reasons.id = posts_reasons.reason_id 
GROUP BY 
    posts.id, 
    TRUNCATE(SUM(reasons.weight), -1) 
HAVING 
    posts.deleted_at IS NOT NULL AND 
    TIMESTAMPDIFF(SECOND, posts.created_at, posts.deleted_at) <= 3600 
ORDER BY 
    TRUNCATE(SUM(reasons.weight), -1) ASC; 

私は特定の問題があることをどのように一般的な与えられた、私はWHERE句で集計機能を持っていないことを確認してください作りました。また、クエリがposts.idにグループ化されていることを確認して、SUM(reasons.weight)集合体を正しく動作させるようにしました。

私はまだ「グループ機能の無効な使用」エラーが発生しています。これを解決するために何をする必要がありますか?

答えて

1

GROUP BYで集合関数を使用することはできません!集計値によってさらに集約する

SELECT 
    TRUNCATE(reasons.weight, -1) AS 'Reasons Weight', 
    AVG(TIMESTAMPDIFF(SECOND, posts.created_at, posts.deleted_at)) AS 'Avg Time To Deletion' 
FROM 
    posts 
    INNER JOIN posts_reasons ON posts_reasons.post_id = posts.id 
    INNER JOIN reasons ON reasons.id = posts_reasons.reason_id 
WHERE 
    posts.deleted_at IS NOT NULL 
    AND TIMESTAMPDIFF(SECOND, posts.created_at, posts.deleted_at) <= 3600 
GROUP BY 
    TRUNCATE(reasons.weight, -1) 
ORDER BY 
    TRUNCATE(reasons.weight, -1) ASC; 

、あなたはサブクエリを使用することができます。

SELECT 
    ReasonsWeight 
    , AVG(TimeToDeletion) AS AvgTimeToDeletion 
    , COUNT(*) AS PostCount 
FROM 
    (
    SELECT 
     TRUNCATE(SUM(reasons.weight), -1) AS ReasonsWeight, 
     MIN(TIMESTAMPDIFF(SECOND, posts.created_at, posts.deleted_at)) AS TimeToDeletion -- This is per post ID here, aggregation does not matter 
    FROM 
     posts 
     INNER JOIN posts_reasons ON posts_reasons.post_id = posts.id 
     INNER JOIN reasons ON reasons.id = posts_reasons.reason_id 
    WHERE 
     posts.deleted_at IS NOT NULL AND 
     TIMESTAMPDIFF(SECOND, posts.created_at, posts.deleted_at) <= 3600 
    GROUP BY 
     posts.id 
) AS SRC 
GROUP BY 
    ReasonsWeight 
ORDER BY 
    ReasonsWeight ASC 
; 
+0

しかし、私は*合計*理由の重量(理由重みのすなわち合計)の10のグループを探しています、個人の体重ではありません。 – ArtOfCode

+0

次にサブクエリを使用します。そこに、更新 – Pred