2010-12-15 4 views
0

전에 주문 방법 : 나는 DBIx :: 클래스를 사용하고나는이처럼 보이는 간단한 임시 테이블을 가지고 DBIx와 GROUP :: 클래스

Table: item_approval 

item user status   modified 
2  fred approved  2010-12-01 00:00:00 
3  fred approved  2010-12-02 00:00:00 
4  fred disapproved 2010-12-03 00:00:00 
7  jack unapproved  2010-12-05 00:00:00 
4  fred approved  2010-12-06 00:00:00 
4  jack unapproved  2010-12-07 00:00:00 
4  fred disapproved 2010-12-04 00:00:00 

. 내가 할 수있는 의미합니다

__PACKAGE__->has_many(
    "item_approvals", 
    "Schema::Result::ItemApproval", 
    { "foreign.item" => "self.id" }, 
    { cascade_copy => 0, cascade_delete => 0 }, 
); 

: 내 "항목"결과는 정의되어 괜찮

my $item = $schema->resultset('Item')->find({id=>4}); 

합니다. 그럼, 할 수있다 : 어떻게 프레드와 잭의 가장 최근의 승인 상태의 집합을받을 수 있나요 :

item user status   modified 
4  fred disapproved 2010-12-03 00:00:00 
4  fred approved  2010-12-06 00:00:00 
4  jack unapproved  2010-12-07 00:00:00 
4  fred disapproved 2010-12-04 00:00:00 

내 질문 :

my @approvals = $item->item_approvals; 

이 같은 결과 집합을 얻을? 나는이 같은 것들을 시도

item user status   modified 
4  fred approved  2010-12-06 00:00:00 
4  jack unapproved  2010-12-07 00:00:00 

: 그건 내가이 결과 집합 싶어한다

my @approvals = $item->search({}, { 
    group_by => 'user', 
    order_by => {-desc => 'modified'} 
}); 

하지만 "BY ORDER는"은 "GROUP BY"후 을 실행을, 그래서 얻을 대신 이런 것들 :

item user status   modified 
4  fred disapproved 2010-12-03 00:00:00 
4  jack unapproved  2010-12-07 00:00:00 

도움 말?

+0

필자는 perl이나 dbix를 모르지만, SQL 수정 방법은 사용자가 수정 한 필드를 'Modified'로 MAX를 수정하여 사용자 당 최고 날짜를 반환하는 것입니다. – JNK

+0

나는 다음과 같은 것들을 사용하여 이것을 약간 사용 해왔다. SELECT item, user, status, MAX (수정 됨) as most_recent FROM item_approval WHERE id = 4; 사용자 당 최고 날짜 *를 반환하지 않습니다. *; 가장 높은 날짜의 단일 행을 반환합니다. –

+0

당신은'MAX (Modified)'와'GROUP BY User' 둘 다 할 필요가 있습니다. 'GROUP'이없는'MAX'는 여러분에게 쿼리의 최대 값을줍니다. GROUP BY는 GROUP BY의 각 그룹에 대해 max (또는 SUM, AVG 등의 집계 함수)를 제공합니다. – JNK

답변

1

귀하의 의견에 설명 된 동작에서 귀하의 데이터베이스가 MySQL이라고 추측합니다. 또한 item_approval 테이블에 PK이라고하는 기본 키가 있다고 가정합니다.

select item, user, status, modified 
from item_approval me 
where PK = (select s.PK from item_approval s where me.item = s.item and me.user = s.user order by s.modified desc, s.PK desc limit 1) 
and me.item = 4 

이 그것에 대해 선택한 서브를 다시 실행하기 때문에 상당히 느린 옵션은 다음과 같습니다

하나의 옵션은 modified 값이 가장 큰 (가장 최근)가 행을 선택하는 선택 서브를 사용하는 것입니다 각 항목/사용자 조합에 대해 하나의 행을 제외한 모든 행을 거부하십시오. 다른 데이터베이스는 비슷한 결과를 얻는 방법이 약간 다릅니다.

관련 문제