2014-03-28 3 views
1

은 내가 게시물 테이블과 같이 있습니다GROUP_BY 또는 포스트 그레스/dbix 클래스와 별개은

+-----+----------+------------+------------+ 
| id | topic_id | text | timestamp | 
+-----+----------+------------+------------+ 
| 789 |  2 |  foobar | 1396026357 | 
| 790 |  2 |  foobar | 1396026358 | 
| 791 |  2 |  foobar | 1396026359 | 
| 792 |  3 |  foobar | 1396026360 | 
| 793 |  3 |  foobar | 1396026361 | 
+-----+----------+------------+------------+ 

어떻게 것이라고 나는 가장 최근의 기록을 당기면서, 주제 ID에 의한 결과를 "그룹화"(에 의해 정렬에 관하여 할 수 타임 스탬프 내림차순)?

"group_by"가 아니라 "distinct on"을 원한다는 사실을 알게되었습니다. 내 포스트그레스 쿼리는 다음과 같습니다.

select distinct on (topic_id) topic_id, id, text, timestamp 
from posts 
order by topic_id desc, timestamp desc; 

위대한 작품입니다. 그러나, DBIx :: Class에서 사용자 정의 ResultSource :: View를 작성할 필요없이 수행 할 수있는 작업인지는 알 수 없습니다. 나는 select와 columns로 group_by의 다양한 배열을 시도해 본 결과 distinct => 1을 시도했다. 결과가 반환되면 실제로 유일성을 유지하지 않는다.

쿼리를 작성하는 방법이 있습니까? 결과 집합 검색을 시도하고 있습니까? 아니면 다른 유형의 쿼리를 통해 동일한 결과를 얻을 수있는 더 좋은 방법이 있습니까?

+1

다음과 같이 : 식별자로 'text' 또는'timestamp'와 같은 기본 유형 이름을 사용하지 마십시오. –

+0

귀하의 의견을 보내 주셔서 감사합니다. 때로는 어떤 것들은 통제에서 벗어 났으며, "결코"또는 "항상"뭔가를하는 것은 선택의 문제가 아닙니다. 고맙게도 큰 따옴표로 col 이름을 래핑 할 수 있습니다. – FoohonPie

답변

1

DBIC 요리 책의 섹션을 grouping results에서 확인하십시오.

my $rs = $base_posts_rs->search(undef, { 
    columns => [ {topic_id=>"topic_id"}, {text=>"text"}, {timestamp=>"timestamp"} ], 
    group_by => ["topic_id"], 
    order_by => [ {-desc=>"topic_id"}, {-desc=>"timestamp"} ], 
}) 

편집 :

my $rs = $base_posts_rs->search(undef, { 
    columns => [ 
     { topic_id => \"MAX(topic_id)" }, 
     { text  => \"MAX(text)" }, 
     { timestamp => \"MAX(timestamp)" }, 
    ], 
    group_by => ["topic_id"], 
    order_by => [ {-desc=>"topic_id"}, {-desc=>"timestamp"} ], 
}) 
이 같은 것이 주위의 엄격한 SQL 그룹화를 얻기 위해 신속하고 더러운 방법

나는 당신이 원하는 것은이 생각의 라인을 따라 뭔가 생각

물론, 필요한 집계 함수를 사용하십시오.

+0

감사합니다. 나는 처음에 요리 책에 갔었는데 위와 같이하면 "GROUP BY 절에 나타나야하거나 집계 함수에 사용되어야한다"라는 오류 메시지가 표시됩니다.이 오류는 그룹화되지 않은 열의 선택을 지원하지 않는 postgres의 결과입니다. : "GROUP BY가있는 경우 그룹화되지 않은 열에 대해 반환 할 값이 두 개 이상 있으므로 SELECT 목록식이 집계 함수를 제외한 그룹화되지 않은 열을 참조하는 것은 유효하지 않습니다." 그룹 절에 다른 열을 추가하려고 시도했지만이 결과가 고유하지 않습니다. – FoohonPie

+0

수정 된 답변을 확인할 수있는 방법이 있습니다. – kbenson

+0

일부 구문 조정을 사용하여 예상대로 결과를 얻을 수 있지만, 각 선택된 필드에서 다른 집계 함수의 결과로 그룹화 된 항목에서 필드 값을 갖는 그룹화 된 결과로 연결되는지 궁금합니다. 그래도 내 목적을 위해 일하는 것처럼 보입니다. 감사합니다. – FoohonPie