복붙노트

[SQL] 레일과 PostgreSQL을 사용하여 발생으로 그룹화 된 목록을 반환

SQL

레일과 PostgreSQL을 사용하여 발생으로 그룹화 된 목록을 반환

나는 Taggings를 사용하여 게시물에 링크 된 내 레일 응용 프로그램에서 태그의 목록을 가지고있다. 일부보기에, 나는 그들이 태그 된 시간과 함께, 5 개 가장 일반적으로 사용되는 태그 목록을 표시하고 싶습니다. 완전한 예제를 만들려면 3 게시물있는 테이블을 가정합니다 :

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

그리고이 개 태그 테이블

TAGS
ID | name
1  | Tag1
2  | Tag2

포스트 1 TAG1 태그와 경우 이제 포스트 2는이 같은 태그 1, 2, 우리 taggings 테이블 외모와 태그가 :

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으로 이동하는 데 필요한거야. 이 모든 필드가 GROUP BY 절에 지정 될 필요하기 때문에 불행하게도 포스트 그레스의 엄격함은 쿼리를 나누기. 나는 그 길을가는 시도했지만, 그것은 내가 행의 수를 얻기 위해 더 이상 t.count 사용할 수 없다는 사실을 가져왔다.

그래서, 결국 질문에 도착합니다 :

포스트 그레스 (버전 9.1)에서 이러한 종류의 정보를 조회하고이를 사용자에게 표시하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.너의 문제:

    너의 문제:

    이 모든 필드가 GROUP BY 절에 지정 될 필요하기 때문에 불행하게도 포스트 그레스의 엄격함은 쿼리를 나누기.

    자,이 PostgreSQL을 9.1로 다소 변경되었습니다 (9.1 릴리스 노트를 인용) :

    무엇보다, 당신이 설명하는 기본 쿼리도 이것으로 실행되지 않을 것입니다 :

    함께 5 개 가장 일반적으로 사용되는 태그 목록보기 시대에 그들은 태그가되었다.

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

    어떤 경우에 작동합니다.

  2. from https://stackoverflow.com/questions/11836874/return-a-grouped-list-with-occurrences-using-rails-and-postgresql by cc-by-sa and MIT license