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

グループごとに最も頻繁に使用されるMySQLSELECT

    SELECT t1.*
    FROM (SELECT tag, category, COUNT(*) AS count
          FROM tags INNER JOIN stuff USING (id)
          GROUP BY tag, category) t1
    LEFT OUTER JOIN 
         (SELECT tag, category, COUNT(*) AS count
          FROM tags INNER JOIN stuff USING (id)
          GROUP BY tag, category) t2
      ON (t1.tag = t2.tag AND (t1.count < t2.count 
          OR t1.count = t2.count AND t1.category < t2.category))
    WHERE t2.tag IS NULL
    ORDER BY t1.count DESC;
    

    これは、単一のSQLクエリには多すぎることに同意します。 GROUP BYの使用 サブクエリ内で私はひるむ。 見た目にすることができます ビューを使用することでより簡単に:

    CREATE VIEW count_per_category AS
        SELECT tag, category, COUNT(*) AS count
        FROM tags INNER JOIN stuff USING (id)
        GROUP BY tag, category;
    
    SELECT t1.*
    FROM count_per_category t1
    LEFT OUTER JOIN count_per_category t2
      ON (t1.tag = t2.tag AND (t1.count < t2.count 
          OR t1.count = t2.count AND t1.category < t2.category))
    WHERE t2.tag IS NULL
    ORDER BY t1.count DESC;
    

    しかし、基本的には舞台裏で同じ作業を行っています。

    アプリケーションコードでも同様の操作が簡単にできるとコメントしています。では、どうしてそんなことをしないのですか?カテゴリごとのカウントを取得するには、より簡単なクエリを実行します。

    SELECT tag, category, COUNT(*) AS count
    FROM tags INNER JOIN stuff USING (id)
    GROUP BY tag, category;
    

    そして、結果をアプリケーションコードで並べ替えます。



    1. 長距離に関連するテーブル間の関係を見つけるにはどうすればよいですか? MySQL

    2. エラー:CursorWindowから行0、列-1を読み取ることができませんでした。データにアクセスする前に、カーソルが正しく初期化されていることを確認してください

    3. PostgreSQLで重複する行を選択する4つの方法

    4. MySQLのInnoDBとMyISAMとは何ですか?