1

重複の可能性:
mysql generate_series で行ジェネレーターを mysql
で同等にする方法

mysql クエリの作成に問題があります。

私の PHP スクリプトは、実行のたびに次のクエリを実行します: INSERT INTO Executes SET UserIp='%s' (%s is user IP)

実行テーブルは次のとおりです。

ExecuteId UNSIGNED BIGINT AI PRIMARY 
Date TIMESTAMP DEFAULT CURRENT_TIMESTAMP INDEX 
UserIp CHAR(24) ... | Some Columns

各時間の実行回数を取得したい。最も明白な解決策は次のとおりです。

SELECT COUNT(*) as ExecutesNum, DATE(Date) as D, HOUR(Date) as H GROUP BY D, H

そしてそれは機能しますが、実行されなかった時間の行は作成されません。

次のような結果を得るには、何を変更する必要がありますか:

  1 | 2012-09-01 | 14

**0 | 2012-09-01 | 15**

 11 | 2012-09-01 | 16

  1 | 2012-09-01 | 17
4

1 に答える 1

2

これはかなり一般的な問題であり、通常、次のようにすべての時間を含む一時テーブルを作成することで解決します。

DROP TABLE IF EXISTS hours;
CREATE TABLE hours (hour VARCHAR(13) PRIMARY KEY);
DROP PROCEDURE IF EXISTS fill_hours;

DELIMITER |
CREATE PROCEDURE fill_hours(start_time DATETIME, end_time DATETIME)
BEGIN
  DECLARE crt_time DATETIME;
  SET crt_time=DATE_SUB(start_time, INTERVAL DATE_FORMAT(start_time, '%i:%s') MINUTE_SECOND);
  WHILE crt_time < end_time DO
    INSERT INTO hours VALUES(DATE_FORMAT(crt_time, '%Y-%m-%d-%H'));
    SET crt_time = DATE_ADD(crt_time, INTERVAL 1 HOUR);
  END WHILE;
END |

CALL fill_hours( (SELECT MIN(Date) FROM Executes), (SELECT MAX(Date) FROM Executes) );

次に、このテーブルを元のテーブルに結合して、必要なものを取得できます。

SELECT
h.hour,
COUNT(e.ExecuteId)
FROM hours h
LEFT JOIN Executes e ON DATE_FORMAT(e.Date, "%Y-%m-%d-%H") = h.hour
GROUP BY h.hour
于 2012-09-09T15:50:15.317 に答える