4

私はこのウェブ フォーラムをアーカイブしていますが、通常は 1 週間に 1 回削除されます。だから私はそれをスクリーンスクレイピングし、データベース(PostgreSQL)に保存しています。

また、フォーラムが最もアクティブな時間帯など、ユーザーが楽しめるいくつかのグラフを使用して、データを少し分析します。

だから私は次のようにpostsテーブルを持っています:

   Column   |            Type
------------+------------------------------
 id         | integer
 body       | text
 created_at | timestamp without time zone
 topic_id   | integer
 user_name  | text
 user_id    | integer

そして、トップ 10 の小さな投稿者テーブルについて、各ユーザーの投稿数を取得したいと考えています。

私はこれを思いついた:

SELECT user_id, user_name, count(*)
FROM posts
GROUP BY user_id, user_name
ORDER BY count DESC LIMIT 10

これは非常に遅いことがわかりました。9 秒、現時点で posts テーブルには約 300,000 行しかありません。

1 つの列だけでグループ化すると、0.5 秒しかかかりませんが、両方が必要です。

私はリレーショナル データベースと SQL にかなり慣れていないので、これが正しいかどうか、またはどのように間違っているのかよくわかりません。

4

2 に答える 2

11

特定の ID を持つユーザーはおそらく 1 人しかいないため、max(user_name)と等しいはずuser_nameです。次に、投稿がより速く動作することを示す単一の列でグループ化できます。

SELECT user_id, max(user_name), count(*)
FROM posts
GROUP BY user_id
于 2010-02-20T17:22:51.253 に答える
0

また、count> 0を使用して、trueのみを返すこともできます。

于 2010-02-20T17:59:55.460 に答える