-1

各メンバーが 1 日あたりに投稿するコメントの平均値を取得するには、助けが必要です。phpで複数のクエリや計算を使うのではなく、mysqlクエリを使って取得したいと考えています。

これらはテーブルとそのフィールドです:

  1. メンバー
    • 番号 (プライマリ)
    • createdDate (タイムスタンプ)
  2. 投稿
    • 番号 (プライマリ)
    • createdDate (タイムスタンプ)
    • メンバー番号
  3. コメント
    • 番号 (プライマリ)
    • createdDate (タイムスタンプ)
    • メンバー番号
    • 投稿数

単一のクエリまたは最小限のクエリを使用して、このような結果を得ることができますか?

+--------------+------------------------+
|  member_num  |  avg_comments_per_day  |
+--------------+------------------------+
|  5           |  10                    |
+--------------+------------------------+
|  24          |  7                     |
+--------------+------------------------+
|  33          |  5                     |
+--------------+------------------------+
|  8           |  1                     |
+--------------+------------------------+
|  9           |  1                     |
+--------------+------------------------+

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

2

あなたは書ける:

SELECT member_num,
       COUNT(1) / COUNT(DISTINCT CAST(createdDate AS DATE)) AS avg_comments_per_day
  FROM comments
 GROUP
    BY member_num
;

これにより、各ユーザーのコメントの合計数を、そのユーザーがコメントを投稿した合計日数で割った値が得られます。(それは「平均」の最も単純な概念のように思えます。別のものが必要な場合は、明確にしてください。)

(免責事項:テストされていません。)

于 2013-04-12T00:04:59.310 に答える
0

そのためには、結合できるすべての可能な日付を含むテーブルが必要です。次のようなものです:

dates table
--------------

date
2001-01-01
2001-01-02
...
2030-12-31

もちろん、必要に応じて開始日と終了日を調整できます。これが必要な理由は、使用のコメントが 0 の日付を計算する方法が必要であり、コメント テーブルには表示されないためです。

次に、このテーブルをコメント テーブルと結合する必要があります。

SELECT
  c.member_num AS `member`,
  d.`date` AS `date`,
  COUNT(c.num) AS `count`
FROM dates AS d
LEFT OUTER JOIN comments AS c
  ON d.`date` = DATE(c.createdDate)
WHERE d.`date` BETWEEN '????-??-??' AND '????-??-??'
GROUP BY `member`, `date`

ここで日付範囲を追加したので、関心のある期間のみ平均を計算できることに注意してください。これを行わないと、日付テーブルのすべての日の平均が得られます。もちろん、これは途中でしか得られません。この情報を平均化する必要があるため、上記のクエリを最後のクエリのサブセレクトとして使用します。

SELECT
    `member`,
    AVG(`count`) AS `daily_average`
FROM
    (SELECT
      c.member_num AS `member`,
      d.`date` AS `date`,
      COUNT(c.num) AS `count`
    FROM dates AS d
    LEFT OUTER JOIN comments AS c
      ON d.`date` = DATE(c.createdDate)
    WHERE d.`date` BETWEEN '????-??-??' AND '????-??-??'
    GROUP BY `member`, `date`) AS `comment_counts`
GROUP BY `member`

もちろん、コメントと日付の間の結合でインデックスを使用しないため、このクエリのパフォーマンスは非常に低くなります。このクエリを定期的に実行する必要がある場合は、コメント数の統計を適切に更新できるテーブルを実際に作成することをお勧めします。

于 2013-04-12T00:11:08.603 に答える