0

Tags私のレールアプリケーションには、をPosts使用してリンクされているのリストがありますTaggings。一部のビューでは、最も一般的に使用されている 5 つのタグのリストと、それらがタグ付けされた回数を表示したいと考えています。完全な例を作成するには、3 つの投稿があるテーブルを想定します。

POSTS
ID | title
1  | Lorem
2  | Ipsum
3  | Dolor

2 つのタグを持つテーブル

TAGS
ID | name
1  | Tag1
2  | Tag2

ここで、投稿 1 に Tag1 がタグ付けされ、投稿 2 にタグ 1 と 2 がタグ付けされている場合、タグ付けテーブルは次のようになります。

TAGGINGS
tag_id | post_id
1      | 1
1      | 2
2      | 2

問題は、次の結果を表示するために必要な情報を取得する方法です (できれば DB に何度も戻ることなく)。

Commonly used tags:
tag1 (2 times)
tag2 (1 time)

tag_idタグを含め、グループ化してカウントで並べ替えることで、MySQL を使用してこれを行うことができました。

ルビー:

taggings = Tagging.select("*, count(tag_id) AS count").includes(:tag).group(:tag_id).order('count(*) DESC').limit(5)
taggings.each { |t| puts "#{t.tag.name} (#{t.count})" }

ただし、アプリを Heroku に移行するため、PostgreSQL 9.1 に移行する必要があります。残念ながら、Postgres の厳密さは、すべてのフィールドgroup byを句で指定する必要があるため、そのクエリを破ります。私はそのようにしようとしましたがt.count、行の数を取得するためにもう使用できないという結果になりました。

それで、最終的に質問に行きます:

postgres (v9.1) からこの種の情報を照会してユーザーに表示する最良の方法は何ですか?

4

1 に答える 1

2

あなたの問題:

残念ながら、Postgres の厳密さは、すべてのフィールドを group by 句で指定する必要があるため、そのクエリを破ります。

現在、PostgreSQL 9.1 では多少変更されています (9.1のリリース ノートを引用)。

GROUP BY句で主キーが指定されている場合、クエリ対象リストで非列を許可します。 GROUP BY(Peter Eisentraut)

さらに、あなたが説明する基本的なクエリは、これにさえ遭遇しません:

最も一般的に使用される 5 つのタグのリストを、それらがタグ付けされた時間と共に表示します。

SELECT tag_id, count(*) AS times
FROM   taggings
GROUP  BY tag_id
ORDER  BY times DESC
LIMIT  5;

どんな場合でも動作します。

于 2012-08-07T14:15:34.387 に答える