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

MySQL Group By Hours

    既存のクエリは次のように減らすことができます:

    SELECT   CONCAT(HOUR(created), ':00-', HOUR(created)+1, ':00') AS Hours
      ,      COUNT(*) AS `usage`
    FROM     history
    WHERE    created BETWEEN '2012-02-07' AND NOW()
    GROUP BY HOUR(created)
    

    すべてを表示するには データがない時間も含めて、データが必要なすべての時間を含むテーブルと外部結合する必要があります。 UNIONを使用して、クエリでこのようなテーブルを作成できます :

    SELECT   CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours
      ,      COUNT(created) AS `usage`
    FROM     history
      RIGHT JOIN (
                       SELECT  0 AS Hour
             UNION ALL SELECT  1 UNION ALL SELECT  2 UNION ALL SELECT  3
             UNION ALL SELECT  4 UNION ALL SELECT  5 UNION ALL SELECT  6
             UNION ALL SELECT  7 UNION ALL SELECT  8 UNION ALL SELECT  9
             UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
             UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
             UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
             UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
             UNION ALL SELECT 22 UNION ALL SELECT 23
      )      AS AllHours ON HOUR(created) = Hour
    WHERE    created BETWEEN '2012-02-07' AND NOW() OR created IS NULL
    GROUP BY Hour
    ORDER BY Hour
    

    ただし、データが存在しないグループの処理は、データベース自体ではなくデータアクセス層に配置するのが最適なビジネスロジックの問題です。実際、アプリケーションが1時間ごとにゼロ値を使用するのは簡単なことです。不在。



    1. DelphiでのBDEとADO

    2. PHPでMYSQLデータベースを転置する方法

    3. PHPで2つのテーブルを結合する

    4. MicrosoftAccessの進化と未来