sql >> データベース >  >> RDS >> Mysql

いくつかのクエリの結果を合計して、SQLで上位5つを見つけます

    UNIONへ 3つのクエリすべての結果の行を選択し、amountが最も高い5つの行を選択します :

    (SELECT event_id, count(*) AS amount
    FROM   pageview 
    GROUP  BY event_id
    ORDER  BY pageviews DESC, rand()
    LIMIT  1000)
    
    UNION ALL
    (SELECT event_id, count(*)
    FROM   upvote
    GROUP  BY event_id
    ORDER  BY upvotes DESC, rand()
    LIMIT  1000)
    
    UNION ALL
    (SELECT event_id, count(*)
    FROM   attending
    GROUP  BY event_id
    ORDER  BY attendants DESC, rand()
    LIMIT  1000)
    
    ORDER  BY 2 DESC
    LIMIT  5;
    

    マニュアル:

    UNION ALL 重複を保持します。

    すべてのevent_idのカウントを追加するには

    SELECT event_id, sum(amount) AS total
    FROM (
       (SELECT event_id, count(*) AS amount
        FROM   pageview 
        GROUP  BY event_id
        ORDER  BY pageviews DESC, rand()
        LIMIT  1000)
        
        UNION ALL
        (SELECT event_id, count(*)
        FROM   upvote
        GROUP  BY event_id
        ORDER  BY upvotes DESC, rand()
        LIMIT  1000)
        
        UNION ALL
        (SELECT event_id, count(*)
        FROM   attending
        GROUP  BY event_id
        ORDER  BY attendants DESC, rand()
        LIMIT  1000)
        ) x
    GROUP  BY 1
    ORDER  BY sum(amount) DESC
    LIMIT  5;
    

    ここで注意が必要なのは、すべてのevent_idではないということです。 3つの基本クエリすべてに存在します。したがって、JOINに注意してください 行が完全に失われることはなく、追加してもNULLにはなりません。 。

    UNION ALLを使用する 、UNIONではありません 。同一の行を削除するのではなく、それらを追加する必要があります。

    x テーブルエイリアスであり、AS xの省略形です。 。サブクエリには名前が必要です。ここでは他の名前にすることができます。

    SOL機能FULL OUTER JOIN MySQLには実装されていないため(前回チェックしたとき)、UNIONを使用する必要があります 。 FULL OUTER JOIN 行を失うことなく、3つの基本クエリすべてを結合します。

    フォローアップの質問への回答

    SELECT event_id, sum(amount) AS total
    FROM (
       (SELECT event_id, count(*) / 100 AS amount
        FROM   pageview ... )
        
        UNION ALL
        (SELECT event_id, count(*) * 5 
        FROM   upvote ... )
        
        UNION ALL
        (SELECT event_id, count(*) * 10
        FROM   attending ... )
        ) x
    GROUP  BY 1
    ORDER  BY  sum(amount) DESC
    LIMIT  5;
    

    または、ベースカウントを複数の方法で使用するには:

    SELECT event_id
          ,sum(CASE source
                  WHEN 'p' THEN amount / 100
                  WHEN 'u' THEN amount * 5
                  WHEN 'a' THEN amount * 10
                  ELSE 0
               END)  AS total
    FROM (
       (SELECT event_id, 'p'::text AS source, count(*) AS amount
        FROM   pageview ... )
        
        UNION ALL
        (SELECT event_id, 'u'::text, count(*)
        FROM   upvote ... )
        
        UNION ALL
        (SELECT event_id, 'a'::text, count(*)
        FROM   attending ... )
        ) x
    GROUP  BY 1
    ORDER  BY 2 DESC
    LIMIT  5;
    



    1. 古いスタイルのOracle外部結合構文-左外部結合の等号の右側にある(+)を見つけるのはなぜですか?

    2. phpインクルードエラーがパスを見つけられません

    3. Oracle:レコードデータ型から選択

    4. 4すぐに使えるSQLデータ変換方法とユースケース