[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.너의 문제:
너의 문제:
이 모든 필드가 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;
어떤 경우에 작동합니다.
from https://stackoverflow.com/questions/11836874/return-a-grouped-list-with-occurrences-using-rails-and-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 외부 데이터 소스에 MySQL 데이터베이스를 동기화하는 방법 (0) | 2020.07.19 |
---|---|
[SQL] 내 SQL 코드에서 오류가 어디에 있습니까? (0) | 2020.07.19 |
[SQL] 기능을 가진 두 개의 열을 반환하는 방법 (0) | 2020.07.19 |
[SQL] 달력 도착 및 출발 날짜 예약 (0) | 2020.07.19 |
[SQL] PostgreSQL을에서 id 컬럼 위치가 중요한가요? (0) | 2020.07.19 |